Overview
ArgoCD exposes Prometheus-format metrics from five components. This guide shows you how to collect those metrics with an OpenTelemetry Collector and send them to SigNoz.
Prerequisites
- A running ArgoCD installation
- Access to SigNoz (Cloud or Self-Hosted)
- OpenTelemetry Collector deployed
Setup
Step 1. Set environment variables
export SIGNOZ_OTLP_ENDPOINT="https://ingest.<region>.signoz.cloud:443"
export SIGNOZ_INGESTION_KEY="<your-ingestion-key>"
<region>: Your SigNoz Cloud region<your-ingestion-key>: Your SigNoz ingestion key
Step 2. Configure the collector
Append the prometheus receiver and resource/argocd processor to your collector config.yaml. Replace each target with the actual host:port where the ArgoCD component is reachable:
receivers:
# ... existing receivers ...
prometheus:
config:
global:
scrape_interval: 60s
scrape_timeout: 30s
scrape_configs:
# Application Controller: sync/health state of all ArgoCD applications
- job_name: argocd-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:8082
labels:
argocd_component: application-controller
# API Server: gRPC/REST request counts and latencies
- job_name: argocd-server-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:8083
labels:
argocd_component: api-server
# Repo Server: Git fetch and manifest generation performance
- job_name: argocd-repo-server-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:8084
labels:
argocd_component: repo-server
# ApplicationSet Controller: template rendering and set reconciliation
- job_name: argocd-applicationset-controller-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:8080
labels:
argocd_component: applicationset-controller
# Notifications Controller: notification delivery and trigger activity
- job_name: argocd-notifications-controller-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:9001
labels:
argocd_component: notifications-controller
processors:
# ... existing processors ...
resource/argocd:
attributes:
- key: service.name
value: argocd
action: upsert
exporters:
# ... existing exporters ...
otlp:
endpoint: ${env:SIGNOZ_OTLP_ENDPOINT}
headers:
signoz-ingestion-key: ${env:SIGNOZ_INGESTION_KEY}
tls:
insecure: false
Add them to your metrics pipeline:
service:
pipelines:
metrics:
receivers: [..., prometheus]
processors: [..., resource/argocd, batch]
exporters: [..., otlp]
Step 3. Run the collector
otelcol-contrib --config config.yaml
Step 1. Set environment variables
Add these to your OpenTelemetry Collector deployment manifest:
env:
- name: K8S_CLUSTER_NAME
value: '<your-cluster-name>'
- name: SIGNOZ_OTLP_ENDPOINT
value: 'https://ingest.<region>.signoz.cloud:443'
- name: SIGNOZ_INGESTION_KEY
value: '<your-ingestion-key>'
<region>: Your SigNoz Cloud region<your-ingestion-key>: Your SigNoz ingestion key<your-cluster-name>: Your Kubernetes cluster identifier
Step 2. Configure the collector
Append the prometheus receiver and resource/argocd processor to your collector config.yaml:
receivers:
# ... existing receivers ...
prometheus:
config:
global:
scrape_interval: 60s
scrape_timeout: 30s
scrape_configs:
# Application Controller: sync/health state of all ArgoCD applications
- job_name: argocd-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- argocd-metrics.argocd.svc.cluster.local:8082
labels:
argocd_component: application-controller
# API Server: gRPC/REST request counts and latencies
- job_name: argocd-server-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- argocd-server-metrics.argocd.svc.cluster.local:8083
labels:
argocd_component: api-server
# Repo Server: Git fetch and manifest generation performance
- job_name: argocd-repo-server-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- argocd-repo-server.argocd.svc.cluster.local:8084
labels:
argocd_component: repo-server
# ApplicationSet Controller: template rendering and set reconciliation
- job_name: argocd-applicationset-controller-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- argocd-applicationset-controller.argocd.svc.cluster.local:8080
labels:
argocd_component: applicationset-controller
# Notifications Controller: notification delivery and trigger activity
- job_name: argocd-notifications-controller-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- argocd-notifications-controller-metrics.argocd.svc.cluster.local:9001
labels:
argocd_component: notifications-controller
processors:
# ... existing processors ...
resource/argocd:
attributes:
- key: service.name
value: argocd
action: upsert
- key: k8s.cluster.name
value: ${K8S_CLUSTER_NAME}
action: upsert
exporters:
# ... existing exporters ...
otlp:
endpoint: ${env:SIGNOZ_OTLP_ENDPOINT}
headers:
signoz-ingestion-key: ${env:SIGNOZ_INGESTION_KEY}
tls:
insecure: false
If ArgoCD runs in a different namespace, update the service names accordingly (e.g., argocd-metrics.<your-namespace>.svc.cluster.local). Verify with kubectl get svc -n <your-namespace>.
Add them to your metrics pipeline:
service:
pipelines:
metrics:
receivers: [..., prometheus]
processors: [..., resource/argocd, batch]
exporters: [..., otlp]
Step 3. Run the collector
kubectl apply -f <your-collector-manifest>.yaml -n <otel-collector-namespace>
Step 1. Set environment variables
The docker run command in Step 3 passes these into the container via -e flags.
export SIGNOZ_OTLP_ENDPOINT="https://ingest.<region>.signoz.cloud:443"
export SIGNOZ_INGESTION_KEY="<your-ingestion-key>"
<region>: Your SigNoz Cloud region<your-ingestion-key>: Your SigNoz ingestion key
Step 2. Configure the collector
Append the prometheus receiver and resource/argocd processor to your config.yaml. Replace each target with the actual host:port where the ArgoCD component is reachable from the container:
receivers:
# ... existing receivers ...
prometheus:
config:
global:
scrape_interval: 60s
scrape_timeout: 30s
scrape_configs:
# Application Controller: sync/health state of all ArgoCD applications
- job_name: argocd-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:8082
labels:
argocd_component: application-controller
# API Server: gRPC/REST request counts and latencies
- job_name: argocd-server-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:8083
labels:
argocd_component: api-server
# Repo Server: Git fetch and manifest generation performance
- job_name: argocd-repo-server-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:8084
labels:
argocd_component: repo-server
# ApplicationSet Controller: template rendering and set reconciliation
- job_name: argocd-applicationset-controller-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:8080
labels:
argocd_component: applicationset-controller
# Notifications Controller: notification delivery and trigger activity
- job_name: argocd-notifications-controller-metrics
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- <argocd-host>:9001
labels:
argocd_component: notifications-controller
processors:
# ... existing processors ...
resource/argocd:
attributes:
- key: service.name
value: argocd
action: upsert
exporters:
# ... existing exporters ...
otlp:
endpoint: ${env:SIGNOZ_OTLP_ENDPOINT}
headers:
signoz-ingestion-key: ${env:SIGNOZ_INGESTION_KEY}
tls:
insecure: false
Add them to your metrics pipeline:
service:
pipelines:
metrics:
receivers: [..., prometheus]
processors: [..., resource/argocd, batch]
exporters: [..., otlp]
Step 3. Run the collector
docker run -d \
-e SIGNOZ_OTLP_ENDPOINT \
-e SIGNOZ_INGESTION_KEY \
-v $(pwd)/config.yaml:/etc/otelcol-contrib/config.yaml \
otel/opentelemetry-collector-contrib:latest \
--config /etc/otelcol-contrib/config.yaml
Advanced Configuration (Optional)
Filter internal metrics
Drop OTel Collector self-telemetry and Prometheus scrape metadata before sending to SigNoz. Append the filter/drop_internal processor and add it to your pipeline:
processors:
# ... existing processors ...
filter/drop_internal:
error_mode: ignore
metric_conditions:
- 'IsMatch(metric.name, "^otelcol_.*")'
- 'IsMatch(metric.name, "^scrape_.*")'
- 'metric.name == "up"'
Include it in your pipeline before the batch processor:
service:
pipelines:
metrics:
receivers: [..., prometheus]
processors: [..., resource/argocd, filter/drop_internal, batch]
exporters: [..., otlp]
Validate
- Go to Metrics in SigNoz.
- Search for
argocd_app_infoor anyargocd_-prefixed metric. - Confirm the
argocd_componentlabel appears on the metrics.
Dashboard
Import the pre-built ArgoCD dashboard to visualize application health, sync status, controller performance, and repository activity. See the ArgoCD Dashboard page for import instructions and a full description of panels.
Troubleshooting
No metrics appearing:
- Verify the collector reaches the ArgoCD metrics endpoints:
kubectl port-forward svc/argocd-metrics 8082:8082 -n argocd
curl localhost:8082/metrics
- Check collector logs for scrape errors:
kubectl logs -n otel-collector <collector-pod-name>
- Confirm service names and ports match your ArgoCD deployment.
Missing component metrics:
Verify the relevant ArgoCD component is running. Some components expose metrics only when enabled (for example, ApplicationSet Controller, Notifications Controller).
Dashboard showing no data:
Confirm the service.name resource attribute equals argocd. The dashboard queries filter on this label.
Next Steps
- Set up alerts on key ArgoCD metrics such as
argocd_app_infohealth status or out-of-sync application counts. - Explore the ArgoCD Dashboard panels for controller performance and repository server activity.
Get Help
If you need help with the steps in this topic, please reach out to us on SigNoz Community Slack.
If you are a SigNoz Cloud user, please use in product chat support located at the bottom right corner of your SigNoz instance or contact us at cloud-support@signoz.io.