feat: start remote writing prometheus data (#16235)

Part of https://github.com/coder/internal/issues/150

- Stop creating the VPC since we rely on an existing VPC in the
scaletest GCP project now
- Add prometheus remote writer to the new prometheus deployment
This commit is contained in:
Garrett Delfosse
2025-01-23 17:02:10 +00:00
committed by GitHub
parent f27e73d21a
commit 7b464334f3
7 changed files with 184 additions and 46 deletions
+13 -21
View File
@@ -5,23 +5,20 @@ locals {
traffic_types = {
ssh = {
wait_duration = "0m"
duration = "30m"
job_timeout = "35m"
duration = "30m"
job_timeout = "35m"
flags = [
"--ssh",
]
}
webterminal = {
wait_duration = "5m"
duration = "25m"
job_timeout = "30m"
flags = []
duration = "25m"
job_timeout = "30m"
flags = []
}
app = {
wait_duration = "10m"
duration = "20m"
job_timeout = "25m"
duration = "20m"
job_timeout = "25m"
flags = [
"--app=wsec",
]
@@ -34,19 +31,14 @@ resource "time_sleep" "wait_baseline" {
kubernetes_job.create_workspaces_primary,
kubernetes_job.create_workspaces_europe,
kubernetes_job.create_workspaces_asia,
helm_release.prometheus_chart_primary,
helm_release.prometheus_chart_europe,
helm_release.prometheus_chart_asia,
]
create_duration = local.wait_baseline_duration
}
resource "time_sleep" "wait_traffic" {
for_each = local.traffic_types
depends_on = [time_sleep.wait_baseline]
create_duration = local.traffic_types[each.key].wait_duration
}
resource "kubernetes_job" "workspace_traffic_primary" {
provider = kubernetes.primary
@@ -106,7 +98,7 @@ resource "kubernetes_job" "workspace_traffic_primary" {
create = local.traffic_types[each.key].job_timeout
}
depends_on = [time_sleep.wait_baseline, time_sleep.wait_traffic[each.key]]
depends_on = [time_sleep.wait_baseline]
}
resource "kubernetes_job" "workspace_traffic_europe" {
@@ -169,7 +161,7 @@ resource "kubernetes_job" "workspace_traffic_europe" {
create = local.traffic_types[each.key].job_timeout
}
depends_on = [time_sleep.wait_baseline, time_sleep.wait_traffic[each.key]]
depends_on = [time_sleep.wait_baseline]
}
resource "kubernetes_job" "workspace_traffic_asia" {
@@ -232,5 +224,5 @@ resource "kubernetes_job" "workspace_traffic_asia" {
create = local.traffic_types[each.key].job_timeout
}
depends_on = [time_sleep.wait_baseline, time_sleep.wait_traffic[each.key]]
depends_on = [time_sleep.wait_baseline]
}
+5 -5
View File
@@ -10,21 +10,21 @@ locals {
url = "http://${var.name}-scaletest.${var.cloudflare_domain}"
region = "us-east1"
zone = "us-east1-c"
cidr = "10.200.0.0/24"
subnet = "scaletest"
}
europe = {
subdomain = "${var.name}-europe-scaletest"
url = "http://${var.name}-europe-scaletest.${var.cloudflare_domain}"
region = "europe-west1"
zone = "europe-west1-b"
cidr = "10.201.0.0/24"
subnet = "scaletest"
}
asia = {
subdomain = "${var.name}-asia-scaletest"
url = "http://${var.name}-asia-scaletest.${var.cloudflare_domain}"
region = "asia-southeast1"
zone = "asia-southeast1-a"
cidr = "10.202.0.0/24"
subnet = "scaletest"
}
}
node_pools = {
@@ -72,8 +72,8 @@ resource "google_container_cluster" "cluster" {
name = "${var.name}-${each.key}"
location = each.value.zone
project = var.project_id
network = google_compute_network.vpc.name
subnetwork = google_compute_subnetwork.subnet[each.key].name
network = local.vpc_name
subnetwork = local.subnet_name
networking_mode = "VPC_NATIVE"
default_max_pods_per_node = 256
ip_allocation_policy { # Required with networking_mode=VPC_NATIVE
+1 -1
View File
@@ -23,7 +23,7 @@ resource "google_sql_database_instance" "db" {
ip_configuration {
ipv4_enabled = false
private_network = google_compute_network.vpc.id
private_network = local.vpc_id
}
insights_config {
+6 -19
View File
@@ -1,20 +1,7 @@
resource "google_compute_network" "vpc" {
project = var.project_id
name = var.name
auto_create_subnetworks = "false"
depends_on = [
google_project_service.api["compute.googleapis.com"]
]
}
resource "google_compute_subnetwork" "subnet" {
for_each = local.deployments
name = "${var.name}-${each.key}"
project = var.project_id
region = each.value.region
network = google_compute_network.vpc.name
ip_cidr_range = each.value.cidr
locals {
vpc_name = "scaletest"
vpc_id = "projects/${var.project_id}/global/networks/${local.vpc_name}"
subnet_name = "scaletest"
}
resource "google_compute_address" "coder" {
@@ -32,11 +19,11 @@ resource "google_compute_global_address" "sql_peering" {
purpose = "VPC_PEERING"
address_type = "INTERNAL"
prefix_length = 16
network = google_compute_network.vpc.id
network = local.vpc_name
}
resource "google_service_networking_connection" "private_vpc_connection" {
network = google_compute_network.vpc.id
network = local.vpc_id
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [google_compute_global_address.sql_peering.name]
}
+118
View File
@@ -0,0 +1,118 @@
locals {
prometheus_helm_repo = "https://prometheus-community.github.io/helm-charts"
prometheus_helm_chart = "kube-prometheus-stack"
prometheus_release_name = "prometheus"
prometheus_remote_write_send_interval = "15s"
prometheus_remote_write_metrics_regex = ".*"
}
resource "helm_release" "prometheus_chart_primary" {
provider = helm.primary
repository = local.prometheus_helm_repo
chart = local.prometheus_helm_chart
name = local.prometheus_release_name
namespace = kubernetes_namespace.coder_primary.metadata.0.name
values = [templatefile("${path.module}/prometheus_helm_values.tftpl", {
nodepool = google_container_node_pool.node_pool["primary_misc"].name,
cluster = "primary",
prometheus_remote_write_url = var.prometheus_remote_write_url,
prometheus_remote_write_metrics_regex = local.prometheus_remote_write_metrics_regex,
prometheus_remote_write_send_interval = local.prometheus_remote_write_send_interval,
})]
}
resource "kubectl_manifest" "pod_monitor_primary" {
provider = kubectl.primary
yaml_body = <<YAML
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
namespace: ${kubernetes_namespace.coder_primary.metadata.0.name}
name: coder-monitoring
spec:
selector:
matchLabels:
"app.kubernetes.io/name": coder
podMetricsEndpoints:
- port: prometheus-http
interval: 30s
YAML
depends_on = [helm_release.prometheus_chart_primary]
}
resource "helm_release" "prometheus_chart_europe" {
provider = helm.europe
repository = local.prometheus_helm_repo
chart = local.prometheus_helm_chart
name = local.prometheus_release_name
namespace = kubernetes_namespace.coder_europe.metadata.0.name
values = [templatefile("${path.module}/prometheus_helm_values.tftpl", {
nodepool = google_container_node_pool.node_pool["europe_misc"].name,
cluster = "europe",
prometheus_remote_write_url = var.prometheus_remote_write_url,
prometheus_remote_write_metrics_regex = local.prometheus_remote_write_metrics_regex,
prometheus_remote_write_send_interval = local.prometheus_remote_write_send_interval,
})]
}
resource "kubectl_manifest" "pod_monitor_europe" {
provider = kubectl.europe
yaml_body = <<YAML
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
namespace: ${kubernetes_namespace.coder_europe.metadata.0.name}
name: coder-monitoring
spec:
selector:
matchLabels:
"app.kubernetes.io/name": coder
podMetricsEndpoints:
- port: prometheus-http
interval: 30s
YAML
depends_on = [helm_release.prometheus_chart_europe]
}
resource "helm_release" "prometheus_chart_asia" {
provider = helm.asia
repository = local.prometheus_helm_repo
chart = local.prometheus_helm_chart
name = local.prometheus_release_name
namespace = kubernetes_namespace.coder_asia.metadata.0.name
values = [templatefile("${path.module}/prometheus_helm_values.tftpl", {
nodepool = google_container_node_pool.node_pool["asia_misc"].name,
cluster = "asia",
prometheus_remote_write_url = var.prometheus_remote_write_url,
prometheus_remote_write_metrics_regex = local.prometheus_remote_write_metrics_regex,
prometheus_remote_write_send_interval = local.prometheus_remote_write_send_interval,
})]
}
resource "kubectl_manifest" "pod_monitor_asia" {
provider = kubectl.asia
yaml_body = <<YAML
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
namespace: ${kubernetes_namespace.coder_asia.metadata.0.name}
name: coder-monitoring
spec:
selector:
matchLabels:
"app.kubernetes.io/name": coder
podMetricsEndpoints:
- port: prometheus-http
interval: 30s
YAML
depends_on = [helm_release.prometheus_chart_asia]
}
@@ -0,0 +1,36 @@
alertmanager:
enabled: false
grafana:
enabled: false
prometheusOperator:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "cloud.google.com/gke-nodepool"
operator: "In"
values: ["${nodepool}"]
prometheus:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "cloud.google.com/gke-nodepool"
operator: "In"
values: ["${nodepool}"]
prometheusSpec:
externalLabels:
cluster: "${cluster}"
podMonitorSelectorNilUsesHelmValues: false
remoteWrite:
- url: "${prometheus_remote_write_url}"
tlsConfig:
insecureSkipVerify: true
writeRelabelConfigs:
- sourceLabels: [__name__]
regex: "${prometheus_remote_write_metrics_regex}"
action: keep
metadataConfig:
sendInterval: "${prometheus_remote_write_send_interval}"
+5
View File
@@ -85,3 +85,8 @@ variable "provisionerd_image_tag" {
description = "Tag to use for Provisionerd image."
default = "latest"
}
// Prometheus
variable "prometheus_remote_write_url" {
description = "URL to push prometheus metrics to."
}