changeset 60:e3151ab43579

moving scrape target configs in py, and into separate retention classes
author drewp@bigasterisk.com
date Sat, 27 Apr 2024 01:31:07 -0700
parents 6a357b483c04
children fb0519859645
files config/create_scrape_configs.py config/scrape_forever.yaml next/create_all.py tasks.py
diffstat 4 files changed, 105 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/config/create_scrape_configs.py	Sat Apr 27 01:31:07 2024 -0700
@@ -0,0 +1,82 @@
+import json
+from pathlib import Path
+
+forever_jobs = [
+    'maildir-count',
+    'mongodb',
+    'net-traffic',
+    'ping',
+    'power-eagle',
+    'smartctl',
+    'wifi',
+    'zfs-exporter',
+    'zigbee2mqtt-exporter',
+    'zpool-exporter',
+]
+
+job_targets = {
+    'maildir-count': ['prime:2500'],
+    'mongodb': ['mongodb:9216'],
+    'net-traffic': ['pipe:8080'],
+    #   - job_name: "ping"
+    #     scrape_interval: 2m
+    #     metrics_path: /probe
+    #     params:
+    #       module: [icmp]
+    #     static_configs:
+    #       - targets:
+    #           # printer, since it falls out of ntop with no traffic at all. Or, we could poll ink status at http://printer/general/status.html?pageid=1
+    #           - printer
+    #           # wireguard connection test
+    #           - prime5
+    #           # after pyinfra or reboot, seems to lose wg0 address
+    #           - garage5
+    #     relabel_configs:
+    #       - {source_labels: [__address__],    target_label: __param_target}
+    #       - {source_labels: [__param_target], target_label: instance}
+    #       - target_label: __address__
+    #         replacement: prober
+    'ping': [':80'], # multi target with tricks
+    'power-eagle': ['power-eagle:80'],
+    'smartctl': [':80'], # per-node!
+    'wifi': ['wifi:80'],
+    'zfs-exporter': ['ditto:9634'],
+    'zigbee2mqtt-exporter': ['zigbee2mqtt-exporter:80'],
+    'zpool-exporter': ['ditto:9986'],
+}
+
+for job in forever_jobs:
+    d = [{
+        "job_name": job,
+        "static_configs": [{
+            "targets": job_targets[job],
+        }],
+        "relabel_configs": [
+            {
+                "target_label": "namespace",
+                "replacement": "default"
+            },
+            {
+                "source_labels": ["__meta_kubernetes_pod_node_name"],
+                "target_label": "node"
+            },
+        ]
+    }]
+
+    if job == 'power-eagle':
+        # from powerEagle/private_config.periodSec
+        d[0]['relabel_configs'].append({
+            "action": "replace",
+            "target_label": "__scrape_interval__",
+            "replacement": "8s",
+        })
+
+    Path(f'{job}.yaml').write_text(json.dumps(d, indent=2, sort_keys=True))
+
+Path('scrape_forever.yaml').write_text(json.dumps({
+    "global": {
+        "scrape_interval": "1m",
+        "scrape_timeout": "10s"
+    },
+    "scrape_config_files": [f'{job}.yaml' for job in forever_jobs],
+}, indent=2))
--- a/config/scrape_forever.yaml	Fri Apr 26 23:37:14 2024 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-# see https://relabeler.promlabs.com/
-
-global:
-  scrape_interval: 1m
-  scrape_timeout: 10s
-
-# scrape_config_files:
-#   - build/scrape_ssl.yaml
-# These can even be urls: https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmagent/README.md#loading-scrape-configs-from-multiple-files
-
-scrape_configs:
-  # some based on https://github.com/prometheus/prometheus/blob/main/documentation/examples/prometheus-kubernetes.yml
-
-  - job_name: "k8services"
-    kubernetes_sd_configs: [{ role: endpoints }]
-    relabel_configs:
-
-      # promote these to display
-      - source_labels: [__meta_kubernetes_service_name]
-        target_label: job
-
-      - source_labels: [__meta_kubernetes_pod_node_name]
-        target_label: node
-
-      # for convenience in this config
-      - source_labels: [__meta_kubernetes_pod_container_port_number]
-        target_label: __port_number
-
-      # period tweaks
-      - if: '{job="power-eagle"}'
-        action: replace
-        target_label: __scrape_interval__
-        # from powerEagle/private_config.periodSec
-        replacement: 8s
-
-      - if: '{job!="power-eagle"}'
-        action: drop
-
--- a/next/create_all.py	Fri Apr 26 23:37:14 2024 -0700
+++ b/next/create_all.py	Sat Apr 27 01:31:07 2024 -0700
@@ -3,7 +3,7 @@
 from output import affinityToNode, build, createIngress, createPv, createPvc, toJson, createSvc
 
 
-def createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, pipelineName):
+def createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, objPrefix):
     (build / f'{agentFileName}_deploy.yaml').write_text(
         toJson({
             "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": agentName },
@@ -15,7 +15,7 @@
                         "annotations": { "prometheus.io/scrape": "true", "prometheus.io/path": f"{pipelineWebRoot}/vmagent/metrics", "prometheus.io/port": "80" }
                     },
                     "spec": {
-                        "volumes": [{ "name": "config", "configMap": { "name": "victoriametrics-config" } }],
+                        "volumes": [{ "name": "config", "configMap": { "name": f"{objPrefix}-config" } }],
                         "serviceAccountName": "victoriametrics",
                         "containers": [{
                             "name": "vmagent",
@@ -154,7 +154,7 @@
     request = "50Gi"
     pipelineWebRoot = f'{webRoot}/{pipelineName}'
 
-    createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, pipelineName)
+    createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, objPrefix)
     createInsertDeploy(tzArg, vmVersion, pipelineWebRoot, insertName, storageName, insertFileName, insertPort)
     createPv(storageFileName, volName, request)
     createPvc(storageFileName, volName, request)
@@ -221,7 +221,7 @@
         ('forever', '100y'),
         ('recent', '90y'),
     ]
-    storageSvcs = [createIngestPipeline(tzArg, vmVersion, webRoot, objPrefix, p, f'scrape_{p}', ret) for p, ret in pipelines]
+    storageSvcs = [createIngestPipeline(tzArg, vmVersion, webRoot, objPrefix, p, f'scrape_{p}.yaml', ret) for p, ret in pipelines]
 
     selectPort = 8481
     createVmselectDeploy(tzArg, vmVersion, webRoot, objPrefix, storageSvcs, selectPort)
--- a/tasks.py	Fri Apr 26 23:37:14 2024 -0700
+++ b/tasks.py	Sat Apr 27 01:31:07 2024 -0700
@@ -34,11 +34,30 @@
     # hup(ctx, 'deploy/victoriametrics', 'victoria-metrics-prod')
 
 
+@task
+def push_config_2024(ctx):
+    # plan:
+    #   every discovered service may:
+    #      - be described here as a forever retention - ignore the discovery
+    #      - be blocked here as a no-metrics service - ignore the discovery
+    #      - be scraped as 'recent', with possible overrides of port/path
+    #   all per-node metrics shall be 'recent' (oops, not smartctl!)
+    map: dict[str, object] = {
+        'rules': alert_rules.allRules(ctx),
+    }
+    for p in Path('config').glob('*.yaml'):
+        map[p.name] = scrapeConfig(p)
+    replaceCmap("next-victoriametrics-config", map)
+    refreshPodCmaps(firstPodName("app=next-victoriametrics-forever-vmagent"))
+  
+
 def scrapeConfig(fn):
     return yaml.load(open(fn), yaml.FullLoader)
 
 
 metricsToMigrate = [
+    'currently_on_wifi',
+    'connected',
     'house_power_kwh',
     'house_power_price',
     'house_power_w',