# VictoriaMetrics ## Ways to send metrics to VictoriaMetrics for multi-tenancy setup ### Option #1: Using Remote Write URL Example metrics data: ``` # HELP dummy_bar dummy counter # TYPE dummy_bar counter dummy_bar{id="0",l1="one",l2="aaa"} 3 dummy_bar{id="1",l1="two",l2="aaa"} 3 dummy_bar{id="2",l1="three",l2="aaa"} 3 dummy_bar{id="3",l1="one",l2="aaa"} 3 dummy_bar{id="4",l1="two",l2="aaa"} 3 dummy_bar{id="5",l1="three",l2="aaa"} 3 dummy_bar{id="6",l1="one",l2="aaa"} 3 dummy_bar{id="7",l1="two",l2="aaa"} 3 dummy_bar{id="8",l1="three",l2="aaa"} 3 dummy_bar{id="9",l1="one",l2="aaa"} 3 ``` By setting... ```yaml # https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-agent/values.yaml remoteWriteUrls: - http://victoria-metrics-victoria-metrics-cluster-vminsert:8480/insert/2/prometheus # The rest of the config ... config: global: scrape_interval: 10s scrape_configs: - job_name: dummy-exporter scrape_interval: 10s static_configs: - targets: ["dummy-exporter.dummy-exporter.svc.cluster.local:80"] ``` ...where `2` in the `remoteWriteUrls` is the tenant ID Pod manifest: ```yaml apiVersion: v1 kind: Pod metadata: annotations: checksum/config: e8d02f03e02dd9e49c3d6e3bdcfd146b29c13b1d2bf7431a4007a2729a0b0895 labels: app.kubernetes.io/instance: vmagent app.kubernetes.io/name: victoria-metrics-agent pod-template-hash: 7b9c96c864 name: vmagent-victoria-metrics-agent-7b9c96c864-lsd7m namespace: observability spec: containers: - args: - -promscrape.config=/config/scrape.yml - -remoteWrite.tmpDataPath=/tmpData - -remoteWrite.url=http://victoria-metrics-victoria-metrics-cluster-vminsert:8480/insert/2/prometheus - -envflag.enable=true - -envflag.prefix=VM_ - -loggerFormat=json image: victoriametrics/vmagent:v1.83.0 livenessProbe: initialDelaySeconds: 5 periodSeconds: 15 tcpSocket: port: http timeoutSeconds: 5 name: victoria-metrics-agent ports: - containerPort: 8429 name: http readinessProbe: httpGet: path: /health port: http initialDelaySeconds: 5 periodSeconds: 15 volumeMounts: - mountPath: /tmpData name: tmpdata - mountPath: /config name: config - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: kube-api-access-7plsg readOnly: true workingDir: / preemptionPolicy: PreemptLowerPriority priority: 0 serviceAccountName: vmagent-victoria-metrics-agent tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 volumes: - name: tmpdata - configMap: name: vmagent-victoria-metrics-agent-config name: config - name: kube-api-access-7plsg projected: sources: - serviceAccountToken: expirationSeconds: 3607 path: token - configMap: items: - key: ca.crt path: ca.crt name: kube-root-ca.crt - downwardAPI: items: - fieldRef: fieldPath: metadata.namespace path: namespace ``` Data in `vmagent-victoria-metrics-agent-config` ConfigMap: ``` # cat /config/scrape.yml global: scrape_interval: 10s scrape_configs: - job_name: dummy-exporter scrape_interval: 10s static_configs: - targets: - dummy-exporter.dummy-exporter.svc.cluster.local:80 ``` --- ### Option #2: Using Multi Tenant URL Example metrics data: ``` # HELP dummy_bar dummy counter # TYPE dummy_bar counter dummy_bar{id="0",l1="one",l2="aaa"} 3 dummy_bar{id="1",l1="two",l2="aaa"} 3 dummy_bar{id="2",l1="three",l2="aaa"} 3 dummy_bar{id="3",l1="one",l2="aaa"} 3 dummy_bar{id="4",l1="two",l2="aaa"} 3 dummy_bar{id="5",l1="three",l2="aaa"} 3 dummy_bar{id="6",l1="one",l2="aaa"} 3 dummy_bar{id="7",l1="two",l2="aaa"} 3 dummy_bar{id="8",l1="three",l2="aaa"} 3 dummy_bar{id="9",l1="one",l2="aaa"} 3 ``` By setting... ```yaml # https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-agent/values.yaml multiTenantUrls: - http://victoria-metrics-victoria-metrics-cluster-vminsert:8480 # The rest of the config ... config: global: scrape_interval: 10s scrape_configs: - job_name: dummy-exporter scrape_interval: 10s static_configs: - targets: ["dummy-exporter.dummy-exporter.svc.cluster.local:80"] relabel_configs: - source_labels: [__address__] target_label: __tenant_id__ replacement: "1" # tenant ID ``` Pod manifest: ```yaml apiVersion: v1 kind: Pod metadata: annotations: checksum/config: 560092ef2eef37de8b945ecd46a2129088796e64b2ba0edba1cfa46b3b54148b labels: app.kubernetes.io/instance: vmagent app.kubernetes.io/name: victoria-metrics-agent pod-template-hash: 56995d9c5b name: vmagent-victoria-metrics-agent-56995d9c5b-f5zfs namespace: observability spec: containers: - args: - -promscrape.config=/config/scrape.yml - -remoteWrite.tmpDataPath=/tmpData - -remoteWrite.multitenantURL=http://victoria-metrics-victoria-metrics-cluster-vminsert:8480 - -envflag.enable=true - -envflag.prefix=VM_ - -loggerFormat=json image: victoriametrics/vmagent:v1.83.0 livenessProbe: initialDelaySeconds: 5 periodSeconds: 15 tcpSocket: port: http timeoutSeconds: 5 name: victoria-metrics-agent ports: - containerPort: 8429 name: http readinessProbe: httpGet: path: /health port: http initialDelaySeconds: 5 periodSeconds: 15 volumeMounts: - mountPath: /tmpData name: tmpdata - mountPath: /config name: config - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: kube-api-access-d6tk2 readOnly: true workingDir: / preemptionPolicy: PreemptLowerPriority priority: 0 serviceAccountName: vmagent-victoria-metrics-agent tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 volumes: - name: tmpdata - configMap: name: vmagent-victoria-metrics-agent-config name: config - name: kube-api-access-d6tk2 projected: sources: - serviceAccountToken: expirationSeconds: 3607 path: token - configMap: items: - key: ca.crt path: ca.crt name: kube-root-ca.crt - downwardAPI: items: - fieldRef: fieldPath: metadata.namespace path: namespace ``` Data in `vmagent-victoria-metrics-agent-config` ConfigMap: ``` # cat config/scrape.yml global: scrape_interval: 10s scrape_configs: - job_name: dummy-exporter relabel_configs: - replacement: "1" source_labels: - __address__ target_label: __tenant_id__ scrape_interval: 10s static_configs: - targets: - dummy-exporter.dummy-exporter.svc.cluster.local:80 ``` --- ### Option #3: Using `vm_account_id` Example metrics data: ``` # HELP dummy_bar dummy gauge # TYPE dummy_bar gauge dummy_bar{id="0",vm_account_id="1"} 0.10119738869055629 dummy_bar{id="1",vm_account_id="1"} 0.7877132336827702 dummy_bar{id="2",vm_account_id="1"} 0.8482502886262785 dummy_bar{id="3",vm_account_id="1"} 0.7474721768346807 dummy_bar{id="4",vm_account_id="1"} 0.7006719919391945 ``` By setting... ```yaml # https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-agent/values.yaml remoteWriteUrls: - http://victoria-metrics-victoria-metrics-cluster-vminsert:8480/insert/multitenant/prometheus/api/v1/write # The rest of the config ... config: global: scrape_interval: 10s scrape_configs: - job_name: dummy-exporter scrape_interval: 10s static_configs: - targets: ["dummy-exporter.dummy-exporter.svc.cluster.local:80"] ``` Pod manifest: ```yaml apiVersion: v1 kind: Pod metadata: annotations: checksum/config: e8d02f03e02dd9e49c3d6e3bdcfd146b29c13b1d2bf7431a4007a2729a0b0895 labels: app.kubernetes.io/instance: vmagent app.kubernetes.io/name: victoria-metrics-agent pod-template-hash: 846ccc9bc4 name: vmagent-victoria-metrics-agent-846ccc9bc4-9j8pr namespace: observability spec: containers: - args: - -promscrape.config=/config/scrape.yml - -remoteWrite.tmpDataPath=/tmpData - -remoteWrite.url=http://victoria-metrics-victoria-metrics-cluster-vminsert:8480/insert/multitenant/prometheus/api/v1/write - -envflag.enable=true - -envflag.prefix=VM_ - -loggerFormat=json image: victoriametrics/vmagent:v1.83.0 livenessProbe: initialDelaySeconds: 5 periodSeconds: 15 tcpSocket: port: http timeoutSeconds: 5 name: victoria-metrics-agent ports: - containerPort: 8429 name: http readinessProbe: httpGet: path: /health port: http initialDelaySeconds: 5 periodSeconds: 15 volumeMounts: - mountPath: /tmpData name: tmpdata - mountPath: /config name: config - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: kube-api-access-sn9x4 readOnly: true workingDir: / preemptionPolicy: PreemptLowerPriority priority: 0 serviceAccountName: vmagent-victoria-metrics-agent tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 volumes: - name: tmpdata - configMap: name: vmagent-victoria-metrics-agent-config name: config - name: kube-api-access-sn9x4 projected: sources: - serviceAccountToken: expirationSeconds: 3607 path: token - configMap: items: - key: ca.crt path: ca.crt name: kube-root-ca.crt - downwardAPI: items: - fieldRef: fieldPath: metadata.namespace path: namespace ``` Data in `vmagent-victoria-metrics-agent-config` ConfigMap: ``` # cat config/scrape.yml global: scrape_interval: 10s scrape_configs: - job_name: dummy-exporter scrape_interval: 10s static_configs: - targets: - dummy-exporter.dummy-exporter.svc.cluster.local:80 ```