Overview
Infisical exports metrics in OpenTelemetry (OTEL) format, which provides maximum flexibility for your monitoring infrastructure. While this guide focuses on Grafana, the OTEL format means you can easily integrate with:- Cloud-native monitoring: AWS CloudWatch, Google Cloud Monitoring, Azure Monitor
- Observability platforms: Datadog, New Relic, Splunk, Dynatrace
- Custom backends: Any system that supports OTEL ingestion
- Traditional monitoring: Prometheus, Grafana (as covered in this guide)
- Pull-based (Prometheus): Exposes metrics on a dedicated endpoint for Prometheus to scrape
- Push-based (OTLP): Sends metrics to an OpenTelemetry Collector via OTLP protocol
Prerequisites
- Self-hosted Infisical instance running
- Access to deploy monitoring services (Prometheus, Grafana, etc.)
- Basic understanding of Prometheus and Grafana
Setup
Environment Variables
Configure the following environment variables in your Infisical backend:- Pull-based Monitoring (Prometheus)
- Push-based Monitoring (OTLP)
This approach exposes metrics on port 9464 at the
/metrics endpoint, allowing Prometheus to scrape the data. The metrics are exposed in Prometheus format but originate from OpenTelemetry instrumentation.Configuration
1
Enable Prometheus export in Infisical
2
Expose the metrics port
Expose the metrics port in your Infisical backend:
- Docker: Expose port 9464
- Kubernetes: Create a service exposing port 9464
- Other: Ensure port 9464 is accessible to your monitoring stack
3
Create Prometheus configuration
Create
prometheus.yml:Replace
infisical-backend:9464 with the actual hostname and port where your Infisical backend is running. This could be:- Docker Compose:
infisical-backend:9464(service name) - Kubernetes:
infisical-backend.default.svc.cluster.local:9464(service name) - Bare Metal:
192.168.1.100:9464(actual IP address) - Cloud:
your-infisical.example.com:9464(domain name)
Deployment Options
Once you’ve configured Infisical to expose metrics, you’ll need to deploy Prometheus to scrape and store them. Below are examples for different deployment environments. Choose the option that matches your infrastructure.- Docker Compose
- Kubernetes
- Helm
Available Metrics
Infisical exposes the following key metrics in OpenTelemetry format:Core API Metrics
These metrics track all HTTP API requests to Infisical, including request counts, latency, and errors. Use these to monitor overall API health, identify performance bottlenecks, and track usage patterns across users and machine identities.Total API Requests
Total API Requests
Metric Name:
infisical.http.server.request.countType: CounterUnit: {request}Description: Total number of API requests to Infisical (covers both human users and machine identities)Attributes:infisical.organization.id(string): Organization IDinfisical.organization.name(string): Organization name (e.g., “Platform Engineering Team”)infisical.user.id(string, optional): User ID if human userinfisical.user.email(string, optional): User email (e.g., “[email protected]”)infisical.identity.id(string, optional): Machine identity IDinfisical.identity.name(string, optional): Machine identity name (e.g., “prod-k8s-operator”)infisical.auth.method(string, optional): Auth method usedhttp.request.method(string): HTTP method (GET, POST, PUT, DELETE)http.route(string): API endpoint route patternhttp.response.status_code(int): HTTP status codeinfisical.project.id(string, optional): Project IDinfisical.project.name(string, optional): Project nameuser_agent.original(string, optional): User agent stringclient.address(string, optional): IP address
Request Duration
Request Duration
Metric Name:
infisical.http.server.request.durationType: HistogramUnit: s (seconds)Description: API request latencyBuckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]Attributes:infisical.organization.id(string): Organization IDinfisical.organization.name(string): Organization nameinfisical.user.id(string, optional): User ID if human userinfisical.user.email(string, optional): User emailinfisical.identity.id(string, optional): Machine identity IDinfisical.identity.name(string, optional): Machine identity namehttp.request.method(string): HTTP methodhttp.route(string): API endpoint route patternhttp.response.status_code(int): HTTP status codeinfisical.project.id(string, optional): Project IDinfisical.project.name(string, optional): Project name
API Errors by Actor
API Errors by Actor
Metric Name:
infisical.http.server.error.countType: CounterUnit: {error}Description: API errors grouped by actor (for identifying misconfigured services)Attributes:infisical.organization.id(string): Organization IDinfisical.organization.name(string): Organization nameinfisical.user.id(string, optional): User ID if humaninfisical.user.email(string, optional): User emailinfisical.identity.id(string, optional): Identity ID if machineinfisical.identity.name(string, optional): Identity namehttp.route(string): API endpoint where error occurredhttp.request.method(string): HTTP methoderror.type(string): Error category/type (client_error, server_error, auth_error, rate_limit_error, etc.)infisical.project.id(string, optional): Project IDinfisical.project.name(string, optional): Project nameclient.address(string, optional): IP addressuser_agent.original(string, optional): User agent information
Secret Operations Metrics
These metrics provide visibility into secret access patterns, helping you understand which secrets are being accessed, by whom, and from where. Essential for security auditing and access pattern analysis.Secret Read Operations
Secret Read Operations
Metric Name:
infisical.secret.read.countType: CounterUnit: {operation}Description: Number of secret read operationsAttributes:infisical.organization.id(string): Organization IDinfisical.organization.name(string): Organization nameinfisical.project.id(string): Project IDinfisical.project.name(string): Project name (e.g., “payment-service-secrets”)infisical.environment(string): Environment (dev, staging, prod)infisical.secret.path(string): Path to secrets (e.g., “/microservice-a/database”)infisical.secret.name(string, optional): Name of secretinfisical.user.id(string, optional): User ID if humaninfisical.user.email(string, optional): User emailinfisical.identity.id(string, optional): Machine identity IDinfisical.identity.name(string, optional): Machine identity nameuser_agent.original(string, optional): User agent/SDK informationclient.address(string, optional): IP address
Authentication Metrics
These metrics track authentication attempts and outcomes, enabling you to monitor login success rates, detect potential security threats, and identify authentication issues.Login Attempts
Login Attempts
Metric Name:
infisical.auth.attempt.countType: CounterUnit: {attempt}Description: Authentication attempts (both successful and failed)Attributes:infisical.organization.id(string): Organization IDinfisical.organization.name(string): Organization nameinfisical.user.id(string, optional): User ID if human (if identifiable)infisical.user.email(string, optional): User email (if identifiable)infisical.identity.id(string, optional): Identity ID if machine (if identifiable)infisical.identity.name(string, optional): Identity name (if identifiable)infisical.auth.method(string): Authentication method attemptedinfisical.auth.result(string): success or failureerror.type(string, optional): Reason for failure if failed (invalid_credentials, expired_token, invalid_token, etc.)client.address(string): IP addressuser_agent.original(string, optional): User agent/client informationinfisical.auth.attempt.username(string, optional): Attempted username/email (if available)
Integration & Secret Sync Metrics
These metrics monitor secret synchronization operations between Infisical and external systems, helping you track sync health, identify integration failures, and troubleshoot connectivity issues.integration_secret_sync_errors
integration_secret_sync_errors
Integration secret sync error count
- Labels:
version,integration,integrationId,type,status,name,projectId - Example: Monitor integration sync failures across different services
secret_sync_sync_secrets_errors
secret_sync_sync_secrets_errors
Secret sync operation error count
- Labels:
version,destination,syncId,projectId,type,status,name - Example: Track secret sync failures to external systems
secret_sync_import_secrets_errors
secret_sync_import_secrets_errors
Secret import operation error count
- Labels:
version,destination,syncId,projectId,type,status,name - Example: Monitor secret import failures
secret_sync_remove_secrets_errors
secret_sync_remove_secrets_errors
Secret removal operation error count
- Labels:
version,destination,syncId,projectId,type,status,name - Example: Track secret removal operation failures
System Metrics
These low-level HTTP metrics are automatically collected by OpenTelemetry’s instrumentation layer, providing baseline performance data for all HTTP traffic.http_server_duration
http_server_duration
HTTP server request duration metrics (histogram buckets, count, sum)
http_client_duration
http_client_duration
HTTP client request duration metrics (histogram buckets, count, sum)
Troubleshooting
Metrics not appearing
Metrics not appearing
If your metrics are not showing up in Prometheus or your monitoring system, check the following:
- Verify
OTEL_TELEMETRY_COLLECTION_ENABLED=trueis set in your Infisical environment variables - Ensure the correct
OTEL_EXPORT_TYPEis set (prometheusorotlp) - Check network connectivity between Infisical and your monitoring services (Prometheus or OTLP collector)
- For pull-based monitoring: Verify port 9464 is exposed and accessible
- For push-based monitoring: Verify the OTLP endpoint URL is correct and reachable
- Check Infisical backend logs for any errors related to metrics export
Authentication errors
Authentication errors
If you’re experiencing authentication errors with the OpenTelemetry Collector:
- Verify basic auth credentials in your OTLP configuration match between Infisical and the collector
- Check that
OTEL_COLLECTOR_BASIC_AUTH_USERNAMEandOTEL_COLLECTOR_BASIC_AUTH_PASSWORDmatch the credentials in yourotel-collector-config.yaml - Ensure the htpasswd format in the collector configuration is correct
- Test the collector endpoint manually using curl with the same credentials to verify they work