From c7a01e73db6fa5816e9983ba2df58c34e7088bd9 Mon Sep 17 00:00:00 2001 From: Vladimir Mihailenco Date: Sat, 9 Aug 2025 15:52:15 +0300 Subject: [PATCH] chore: upgrade otel example to Uptrace v2 Uptrace v2 comes with a new config file and new defaults. Also updated dependencies to the latest versions. --- example/otel/README.md | 129 +++-- example/otel/client.go | 5 +- example/otel/config/otel-collector.yaml | 20 +- example/otel/docker-compose.yml | 43 +- example/otel/image/metrics.png | Bin 32347 -> 24082 bytes example/otel/image/redis-trace.png | Bin 21536 -> 22941 bytes example/otel/uptrace.yml | 663 +++++++++++++++--------- 7 files changed, 551 insertions(+), 309 deletions(-) diff --git a/example/otel/README.md b/example/otel/README.md index f948f91be6..8db4667b0f 100644 --- a/example/otel/README.md +++ b/example/otel/README.md @@ -1,59 +1,124 @@ -# Example for go-redis OpenTelemetry instrumentation +# go-redis OpenTelemetry Monitoring with Uptrace -This example demonstrates how to monitor Redis using OpenTelemetry and -[Uptrace](https://github.com/uptrace/uptrace). It requires Docker to start Redis Server and Uptrace. +This example demonstrates how to instrument and monitor Redis operations in Go applications using +OpenTelemetry and [Uptrace](https://github.com/uptrace/uptrace), providing comprehensive +observability into your Redis performance and operations. -See -[Monitoring Go Redis Performance and Errors](https://redis.uptrace.dev/guide/go-redis-monitoring.html) -for details. +## Overview -**Step 1**. Download the example using Git: +This integration provides: -```shell +- **Distributed tracing** for Redis operations +- **Performance monitoring** with latency and throughput metrics +- **Error tracking** and debugging capabilities +- **Visual dashboards** for Redis health monitoring +- **Production-ready** observability stack with Docker + +## Prerequisites + +- Go 1.19+ +- Docker and Docker Compose +- Basic understanding of Redis and OpenTelemetry + +## Quick Start + +### 1. Clone and Navigate + +```bash git clone https://github.com/redis/go-redis.git cd example/otel ``` -**Step 2**. Start the services using Docker: +### 2. Start the Monitoring Stack + +Launch Redis and Uptrace services: -```shell -docker-compose up -d +```bash +docker compose up -d ``` -**Step 3**. Make sure Uptrace is running: +This starts: + +- Redis server on `localhost:6379` +- Uptrace APM on `http://localhost:14318` -```shell -docker-compose logs uptrace +### 3. Verify Services + +Check that Uptrace is running properly: + +```bash +docker compose logs uptrace ``` -**Step 4**. Run the Redis client example and Follow the link to view the trace: +Look for successful startup messages without errors. + +### 4. Run the Example + +Execute the instrumented Redis client: -```shell +```bash go run client.go +``` + +You should see output similar to: + +``` trace: http://localhost:14318/traces/ee029d8782242c8ed38b16d961093b35 ``` -![Redis trace](./image/redis-trace.png) +Click the trace URL to view detailed operation traces in Uptrace. + +![Redis trace visualization](./image/redis-trace.png) + +### 5. Explore the Dashboard + +Open the Uptrace UI at [http://localhost:14318](http://localhost:14318/metrics/1) to explore: + +- **Traces**: Individual Redis operation details +- **Metrics**: Performance statistics and trends +- **Logs**: Application and system logs +- **Service Map**: Visual representation of dependencies + +## Advanced Monitoring Setup + +### Redis Performance Metrics -You can also open Uptrace UI at [http://localhost:14318](http://localhost:14318) to view available -spans, logs, and metrics. +For production environments, enable comprehensive Redis monitoring by installing the OpenTelemetry +Collector: -## Redis monitoring +The [OpenTelemetry Collector](https://uptrace.dev/opentelemetry/collector) acts as a telemetry agent +that: -You can also [monitor Redis performance](https://uptrace.dev/opentelemetry/redis-monitoring.html) -metrics By installing OpenTelemetry Collector. +- Pulls performance metrics directly from Redis +- Collects system-level statistics +- Forwards data to Uptrace via OTLP protocol -[OpenTelemetry Collector](https://uptrace.dev/opentelemetry/collector.html) is an agent that pulls -telemetry data from systems you want to monitor and sends it to APM tools using the OpenTelemetry -protocol (OTLP). +When configured, Uptrace automatically generates a Redis dashboard: -When telemetry data reaches Uptrace, it automatically generates a Redis dashboard from a pre-defined -template. +![Redis performance dashboard](./image/metrics.png) -![Redis dashboard](./image/metrics.png) +### Key Metrics Monitored + +- **Connection Statistics**: Active connections, connection pool utilization +- **Command Performance**: Operation latency, throughput, error rates +- **Memory Usage**: Memory consumption, key distribution +- **Replication Health**: Master-slave sync status and lag + +### Logs and Debugging + +View service logs: + +```bash +# All services +docker compose logs + +# Specific service +docker compose logs redis +docker compose logs uptrace +``` -## Links +## Additional Resources -- [Uptrace open-source APM](https://uptrace.dev/get/open-source-apm.html) -- [OpenTelemetry Go instrumentations](https://uptrace.dev/opentelemetry/instrumentations/?lang=go) -- [OpenTelemetry Go Tracing API](https://uptrace.dev/opentelemetry/go-tracing.html) +- [Complete go-redis Monitoring Guide](https://redis.uptrace.dev/guide/go-redis-monitoring.html) +- [OpenTelemetry Go Instrumentation](https://uptrace.dev/get/opentelemetry-go/tracing) +- [Uptrace Open Source APM](https://uptrace.dev/get/hosted/open-source-apm) diff --git a/example/otel/client.go b/example/otel/client.go index 984d83f09a..165a9234a7 100644 --- a/example/otel/client.go +++ b/example/otel/client.go @@ -7,10 +7,11 @@ import ( "sync" "time" - "github.com/uptrace/uptrace-go/uptrace" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/codes" + "github.com/uptrace/uptrace-go/uptrace" + "github.com/redis/go-redis/extra/redisotel/v9" "github.com/redis/go-redis/v9" ) @@ -22,7 +23,7 @@ func main() { uptrace.ConfigureOpentelemetry( // copy your project DSN here or use UPTRACE_DSN env var - uptrace.WithDSN("http://project2_secret_token@localhost:14317/2"), + uptrace.WithDSN("http://project1_secret@localhost:14318/2?grpc=14317"), uptrace.WithServiceName("myservice"), uptrace.WithServiceVersion("v1.0.0"), diff --git a/example/otel/config/otel-collector.yaml b/example/otel/config/otel-collector.yaml index 2cb130dd61..6d79694eb1 100644 --- a/example/otel/config/otel-collector.yaml +++ b/example/otel/config/otel-collector.yaml @@ -23,9 +23,15 @@ receivers: redis: endpoint: 'redis-server:6379' collection_interval: 10s - jaeger: - protocols: - grpc: + postgresql: + endpoint: postgres:5432 + transport: tcp + username: uptrace + password: uptrace + databases: + - uptrace + tls: + insecure: true processors: resourcedetection: @@ -37,10 +43,10 @@ processors: exporters: otlp/uptrace: - endpoint: http://uptrace:14317 + endpoint: http://uptrace:4317 tls: insecure: true - headers: { 'uptrace-dsn': 'http://project2_secret_token@localhost:14317/2' } + headers: { 'uptrace-dsn': 'http://project1_secret@localhost:14318/2?grpc=14317' } debug: service: @@ -49,7 +55,7 @@ service: # level: DEBUG pipelines: traces: - receivers: [otlp, jaeger] + receivers: [otlp] processors: [batch] exporters: [otlp/uptrace] metrics: @@ -57,7 +63,7 @@ service: processors: [cumulativetodelta, batch] exporters: [otlp/uptrace] metrics/hostmetrics: - receivers: [hostmetrics, redis] + receivers: [hostmetrics, redis, postgresql] processors: [cumulativetodelta, batch, resourcedetection] exporters: [otlp/uptrace] logs: diff --git a/example/otel/docker-compose.yml b/example/otel/docker-compose.yml index 4244792a94..021f5658c4 100644 --- a/example/otel/docker-compose.yml +++ b/example/otel/docker-compose.yml @@ -1,10 +1,10 @@ -version: '3' - services: clickhouse: - image: clickhouse/clickhouse-server:23.7 + image: clickhouse/clickhouse-server:25.3.5 restart: on-failure environment: + CLICKHOUSE_USER: uptrace + CLICKHOUSE_PASSWORD: uptrace CLICKHOUSE_DB: uptrace healthcheck: test: ['CMD', 'wget', '--spider', '-q', 'localhost:8123/ping'] @@ -12,13 +12,13 @@ services: timeout: 1s retries: 30 volumes: - - ch_data2:/var/lib/clickhouse + - ch_data:/var/lib/clickhouse ports: - '8123:8123' - '9000:9000' postgres: - image: postgres:15-alpine + image: postgres:17-alpine restart: on-failure environment: PGDATA: /var/lib/postgresql/data/pgdata @@ -31,27 +31,27 @@ services: timeout: 1s retries: 30 volumes: - - 'pg_data2:/var/lib/postgresql/data/pgdata' + - 'pg_data:/var/lib/postgresql/data/pgdata' ports: - '5432:5432' uptrace: - image: 'uptrace/uptrace:1.6.2' + image: 'uptrace/uptrace:2.0.0' #image: 'uptrace/uptrace-dev:latest' restart: on-failure volumes: - - ./uptrace.yml:/etc/uptrace/uptrace.yml + - ./uptrace.yml:/etc/uptrace/config.yml #environment: # - DEBUG=2 ports: - - '14317:14317' - - '14318:14318' + - '14317:4317' + - '14318:80' depends_on: clickhouse: condition: service_healthy otelcol: - image: otel/opentelemetry-collector-contrib:0.91.0 + image: otel/opentelemetry-collector-contrib:0.123.0 restart: on-failure volumes: - ./config/otel-collector.yaml:/etc/otelcol-contrib/config.yaml @@ -64,11 +64,19 @@ services: volumes: - ./config/vector.toml:/etc/vector/vector.toml:ro - mailhog: - image: mailhog/mailhog:v1.0.1 - restart: on-failure + mailpit: + image: axllent/mailpit + restart: always ports: - - '8025:8025' + - 1025:1025 + - 8025:8025 + environment: + MP_MAX_MESSAGES: 5000 + MP_DATA_FILE: /data/mailpit.db + MP_SMTP_AUTH_ACCEPT_ANY: 1 + MP_SMTP_AUTH_ALLOW_INSECURE: 1 + volumes: + - mailpit_data:/data redis-server: image: redis @@ -78,5 +86,6 @@ services: image: redis volumes: - ch_data2: - pg_data2: + ch_data: + pg_data: + mailpit_data: diff --git a/example/otel/image/metrics.png b/example/otel/image/metrics.png index 7c2beb4d6444a954184d6847bebd586339683f3d..899ae64b4ee22d7bd35959aeca972186daedb432 100644 GIT binary patch literal 24082 zcmZsD2UJtf)-Q+(N>k}YiXe*8Lnj0g1d*nIAYF zbXY(29IhheD=FrxIv*P=Qt>0YEmfNGVN_LpC`%(}E9wm@TjR+Baz`m$jT4LloCuhOBel18FWo`4!ph8T9a{N7Ps`=`Bz?J`92_(uK3WdFlk*ao3-Np2DC ztX>}d61j3EW%VIK(~G(Z3O0TNEYR5+hOAr5oVAg4+Fqqzm}X4!0rJ&8ryag`l`rSd zw{s0QWo%aur?qb)b?cF%z>^{Q>}#FZ>f)Zf`y-VWV%q>wIzWas=lTByCdC+`7S>8n zh9YlJ_rCx6bJH|ru8~1mf0A&vh|5h$?NW%x zhB<`n^O-BN!|qoeDZ$Xz) z2-&k7n@Jvy$UN&Ljwwn@{8r7Or9I0M4QcbXH|qLHt2d-3w6V>+X*C*tYNn@jBji?p zPVDD{=g=U@gtPi<5>1$d!pw9Jfx%a8QFm!~!o4M#I4QI{Ra;o63 zGpuAX$+)(%EmEy4cQ%hGAF+q+^dP*e<(PI&A-b9jQCC*faa#7m z`8^QjP)D&}BN#`UVE9~pjBj4s;O=txqeoJYUR(=PCbu*MGndMcw-Igi9qUu%b-J5QI&<�cxc6@@zHlCV&w)aZ(O8Mn=P~S5q!)@d2 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 literal 32347 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 ABme*a diff --git a/example/otel/image/redis-trace.png b/example/otel/image/redis-trace.png index 4f7115e1c515b40ee873c6ba6ed7a4c07bfe5ffb..fb31d2e8b199e3016a7241f2f04601e810907633 100644 GIT binary patch literal 22941 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 Fe*h|Fid_Hz literal 21536 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 JiH_Z~e*xt@h?@Wa diff --git a/example/otel/uptrace.yml b/example/otel/uptrace.yml index 90ecbf7502..35cb733064 100644 --- a/example/otel/uptrace.yml +++ b/example/otel/uptrace.yml @@ -1,265 +1,426 @@ -## -## Uptrace configuration file. -## See https://uptrace.dev/get/config.html for details. -## -## You can use environment variables anywhere in this file, for example: -## -## foo: $FOO -## bar: ${BAR} -## baz: ${BAZ:default} -## -## To escape `$`, use `$$`, for example: -## -## foo: $$FOO_BAR -## - -## -## ClickHouse database credentials. -## -ch: - addr: clickhouse:9000 - user: default - password: - database: uptrace - - # Maximum query execution time. - max_execution_time: 30s - - # TLS configuration. Uncomment to enable. - # tls: - # insecure_skip_verify: true - - # TLS configuration. Uncomment to enable. - # tls: - # insecure_skip_verify: true # only for self-signed certificates - -## -## PostgreSQL db that is used to store metadata such us metric names, dashboards, alerts, -## and so on. -## -pg: - addr: postgres:5432 - user: uptrace - password: uptrace - database: uptrace - -## -## A list of pre-configured projects. Each project is fully isolated. -## -projects: - # Conventionally, the first project is used to monitor Uptrace itself. - - id: 1 - name: Uptrace - # Token grants write access to the project. Keep a secret. - token: project1_secret_token - pinned_attrs: - - service_name - - host_name - - deployment_environment - # Group spans by deployment.environment attribute. - group_by_env: false - # Group funcs spans by service.name attribute. - group_funcs_by_service: false - # Enable prom_compat if you want to use the project as a Prometheus datasource in Grafana. - prom_compat: true - - # Other projects can be used to monitor your applications. - # To monitor micro-services or multiple related services, use a single project. - - id: 2 - name: My project - token: project2_secret_token - pinned_attrs: - - service_name - - host_name - - deployment_environment - group_by_env: false - group_funcs_by_service: false - prom_compat: true - -## -## Create metrics from spans and events. -## -metrics_from_spans: - - name: uptrace.tracing.spans - description: Spans duration (excluding events) - instrument: histogram - unit: microseconds - value: _duration / 1000 - attrs: - - _system - - _group_id - - service_name - - host_name - - _status_code - annotations: - - display_name - where: _event_name = '' - - - name: uptrace.tracing.events - description: Events count (excluding spans) - instrument: counter - unit: 1 - value: _count - attrs: - - _system - - _group_id - - _name - - host_name - annotations: - - display_name - where: _is_event = 1 - -## -## To require authentication, uncomment one of the following sections. -## +# ============================================================================= +# Uptrace Configuration +# ============================================================================= +# Complete configuration reference: https://uptrace.dev/get/hosted/config +# +# Environment Variable Support: +# - Simple substitution: foo: $FOO +# - With braces: bar: ${BAR} +# - With defaults: baz: ${BAZ:default_value} +# - To escape '$': foo: $$FOO_BAR +# ============================================================================= + +# ----------------------------------------------------------------------------- +# Service Configuration +# ----------------------------------------------------------------------------- +# Core service settings that define the runtime environment and security +service: + env: hosted # Environment: hosted, development, production + secret: FIXME # Secret key for cryptographic operations (CHANGE THIS!) + +# ----------------------------------------------------------------------------- +# Site Configuration +# ----------------------------------------------------------------------------- +# External-facing URLs and endpoints for client connections +site: + # Primary URL where users access the Uptrace UI and API + # This URL is used for: + # - Generating dashboard links in notifications + # - CORS validation for browser requests + # - Redirect URIs for authentication flows + # IMPORTANT: Must be accessible from all clients and match your reverse proxy setup + url: http://localhost:14318 + + # Dedicated URL for telemetry data ingestion (OTLP endpoints) + # Use this to separate data ingestion from UI traffic for: + # - Load balancing optimization + # - Different security policies + # - CDN/edge deployment scenarios + # If empty, defaults to site.url + ingest_url: http://localhost:14318?grpc=14317 + +# ----------------------------------------------------------------------------- +# Network Listeners +# ----------------------------------------------------------------------------- +# Configure network interfaces and ports for different protocols +listen: + # HTTP server configuration + # Handles: OTLP/HTTP API, REST API, and Vue.js web interface + http: + # Network address and port to bind to + # Format: [host]:port or :port (binds to all interfaces) + # Common values: :80, :8080, localhost:8080 + addr: :80 + + # gRPC server configuration + # Handles: OTLP/gRPC API for high-performance telemetry ingestion + # Standard OTLP gRPC port is 4317 + grpc: + addr: :4317 + + # TLS/SSL configuration for HTTPS and secure gRPC + # Uncomment and configure for production deployments + #tls: + # cert_file: /etc/uptrace/server.crt + # key_file: /etc/uptrace/server.key + +# ----------------------------------------------------------------------------- +# Authentication & Authorization +# ----------------------------------------------------------------------------- +# User authentication and access control settings auth: - users: - - name: Anonymous - email: uptrace@localhost - password: uptrace - notify_by_email: true - - # Cloudflare Zero Trust Access (Identity) - # See https://developers.cloudflare.com/cloudflare-one/identity/ for more info. - # cloudflare: - # # The base URL of the Cloudflare Zero Trust team. - # - team_url: https://myteam.cloudflareaccess.com - # # The Application Audience (AUD) Tag for this application. - # # You can retrieve this from the Cloudflare Zero Trust 'Access' Dashboard. - # audience: bea6df23b944e4a0cd178609ba1bb64dc98dfe1f66ae7b918e563f6cf28b37e0 - - # OpenID Connect (Single Sign-On) - oidc: - # # The ID is used in API endpoints, for example, in redirect URL - # # `http:///api/v1/sso//callback`. - # - id: keycloak - # # Display name for the button in the login form. - # # Default to 'OpenID Connect' - # display_name: Keycloak - # # The base URL for the OIDC provider. - # issuer_url: http://localhost:8080/realms/uptrace - # # The OAuth 2.0 Client ID - # client_id: uptrace - # # The OAuth 2.0 Client Secret - # client_secret: ogbhd8Q0X0e5AZFGSG3m9oirPvnetqkA - # # Additional OAuth 2.0 scopes to request from the OIDC provider. - # # Defaults to 'profile'. 'openid' is requested by default and need not be specified. - # scopes: - # - profile - -## -## Various options to tweak ClickHouse schema. -## For changes to take effect, you need reset the ClickHouse database with `ch reset`. -## -ch_schema: - # Compression codec, for example, LZ4, ZSTD(3), or Default. - compression: ZSTD(3) + # Disable built-in username/password authentication + # Useful when using only SSO providers (OAuth, SAML, etc.) + # Note: SSO authentication methods will remain available + #disabled: true - # Whether to use ReplicatedMergeTree instead of MergeTree. + # Email domain restriction for user registration + # Only users with email addresses matching this regex can register/login + # Examples: + # - '^.+@example\.com$' - only @example.com domain + # - '^.+@(example|acme)\.com$' - multiple domains + # - '^[^@]+@example\.com$' - stricter validation + #email_regexp: '^.+@example\.com$' + +# ----------------------------------------------------------------------------- +# Bootstrap Data +# ----------------------------------------------------------------------------- +# Initial data created during first startup - defines default users, organizations, and projects +# This data is only created once and can be modified through the UI afterward +seed_data: + # Default users created on first startup + users: + - key: user1 # Internal reference key (used in relationships below) + name: Admin # Display name in UI + email: admin@uptrace.local # Login email (must be unique) + password: admin # Plain text password (CHANGE THIS IMMEDIATELY!) + email_confirmed: true + + # API tokens for user authentication + # These tokens can be used for API access and programmatic operations + user_tokens: + - key: user_token1 # Internal reference key + user_key: user1 # References user.key above + token: user1_secret # API token value (CHANGE THIS!) + + # Organizations for multi-tenant deployments + # Organizations group users and projects together + orgs: + - key: org1 # Internal reference key + name: Org1 # Organization display name + + # Organization membership and roles + # Defines which users belong to which organizations + org_users: + - key: org_user1 # Internal reference key + org_key: org1 # References org.key above + user_key: user1 # References user.key above + role: owner # Role: owner, admin, or member + + # Projects contain telemetry data and are isolated from each other + # Each project has its own spans, logs, metrics, and dashboards + projects: + - key: project1 # Internal reference key + name: Project1 # Project display name + org_key: org1 # References org.key above + + # Project-specific tokens for telemetry data ingestion + # These tokens are used in OTLP DSN strings for sending data + project_tokens: + - key: project_token1 # Internal reference key + project_key: project1 # References project.key above + token: project1_secret # Token value for DSN (CHANGE THIS!) + + # Project user permissions + # Controls who can access and modify project data + project_users: + - key: project_user1 # Internal reference key + project_key: project1 # References project.key above + org_user_key: org_user1 # References org_user.key above + perm_level: admin # Permission level: admin, editor, or viewer + +# ----------------------------------------------------------------------------- +# ClickHouse Database Configuration +# ----------------------------------------------------------------------------- +# Primary storage for high-volume telemetry data (spans, logs, metrics) +# ClickHouse is optimized for analytical queries and time-series data +ch_cluster: + # Cluster name for ClickHouse operations + # Used internally for distributed queries and table management + cluster: uptrace1 + + # Enable ClickHouse replicated tables for high availability + # Requires cluster configuration with multiple replicas + # Provides automatic failover and data redundancy replicated: false - # Cluster name for Distributed tables and ON CLUSTER clause. - #cluster: uptrace1 - - spans: - # Delete spans data after 30 days. - ttl_delete: 7 DAY - storage_policy: 'default' - - metrics: - # Delete metrics data after 90 days. - ttl_delete: 30 DAY - storage_policy: 'default' - -## -## Addresses on which Uptrace receives gRPC and HTTP requests. -## -listen: - # OTLP/gRPC API. - grpc: - addr: ':14317' - - # OTLP/HTTP API and Uptrace API with UI. - http: - addr: ':14318' + # Enable ClickHouse distributed tables for horizontal scaling + # Requires cluster configuration across multiple shards + # Only available in Premium Edition + distributed: false + + # Database shards configuration + # Each shard can have multiple replicas for redundancy + shards: + - replicas: + - addr: clickhouse:9000 # ClickHouse server address + database: uptrace # Database name (must exist) + user: uptrace # Database user with write permissions + password: uptrace # Database password + + # Connection timeout settings + dial_timeout: 3s # Time to wait for connection establishment + write_timeout: 5s # Time to wait for write operations + max_retries: 3 # Number of retry attempts for failed operations + + # Query execution timeout + # Prevents long-running queries from consuming resources + max_execution_time: 15s + + # TLS configuration for secure database connections + # Uncomment for production deployments with SSL/TLS + #tls: + # insecure_skip_verify: true # WARNING: Only use for self-signed certificates + +# ----------------------------------------------------------------------------- +# PostgreSQL Database Configuration +# ----------------------------------------------------------------------------- +# Metadata storage for application data (users, projects, dashboards, alerts, etc.) +# PostgreSQL provides ACID compliance for critical application state +pg: + addr: postgres:5432 # PostgreSQL server address + user: uptrace # Database user with full permissions + password: uptrace # Database password + database: uptrace # Database name (must exist) + + # TLS configuration for secure database connections + # Recommended for production deployments + #tls: + # insecure_skip_verify: true # WARNING: Only use for self-signed certificates + +# ----------------------------------------------------------------------------- +# ClickHouse Schema Configuration +# ----------------------------------------------------------------------------- +# Advanced schema settings for performance optimization +# WARNING: Changes require 'ch reset' command and will delete all data +ch_schema: + # Data compression algorithm for storage efficiency + # Options: + # - LZ4: Fast compression/decompression, moderate compression ratio + # - ZSTD(1): Better compression ratio, slightly slower + # - Default: ClickHouse default compression + compression: ZSTD(1) + + # Storage policies for different data types + # Allows using different storage tiers (SSD, HDD, S3) for different data + spans_index: { storage_policy: default } # Span search indexes + spans_data: { storage_policy: default } # Raw span data + span_links: { storage_policy: default } # Span relationship data + logs_index: { storage_policy: default } # Log search indexes + logs_data: { storage_policy: default } # Raw log data + events_index: { storage_policy: default } # Event search indexes + events_data: { storage_policy: default } # Raw event data + metrics: { storage_policy: default } # Metrics time-series data + +# ----------------------------------------------------------------------------- +# Redis Cache Configuration +# ----------------------------------------------------------------------------- +# In-memory cache for improved query performance and session storage +# Reduces database load and improves response times +redis_cache: + # Redis server addresses + # For cluster setup, add multiple addresses + addrs: + 1: redis-server:6379 + + # Redis authentication credentials + username: "" # Redis username (Redis 6.0+) + password: "" # Redis password + db: 0 # Redis database number (0-15) + + # TLS configuration for secure Redis connections + # Recommended for production deployments + #tls: + # insecure_skip_verify: true # WARNING: Only use for self-signed certificates + +# ----------------------------------------------------------------------------- +# SSL/TLS Certificate Management +# ----------------------------------------------------------------------------- +# Automatic certificate issuance and renewal via Let's Encrypt ACME protocol +certmagic: + enabled: false # Enable automatic certificate management + staging_ca: false # Use Let's Encrypt staging environment for testing + http_challenge_addr: :80 # Address for HTTP-01 challenge validation + +# ----------------------------------------------------------------------------- +# Email Configuration +# ----------------------------------------------------------------------------- +# SMTP configuration for alert notifications and user management emails +# Required for: password resets, alert notifications, user invitations +# Documentation: https://uptrace.dev/features/alerting +mailer: + smtp: + enabled: false # Enable email notifications + host: localhost # SMTP server hostname + port: 1025 # SMTP server port (25, 465, 587, 1025) + username: mailhog # SMTP authentication username + password: mailhog # SMTP authentication password + from: no-reply@uptrace.local # Sender email address (must be authorized) + + # TLS configuration + # Most production SMTP servers require TLS + #tls: { insecure: true } # Uncomment to disable opportunistic TLS + +# ----------------------------------------------------------------------------- +# Telemetry Data Processing Configuration +# ----------------------------------------------------------------------------- +# Performance tuning for different types of telemetry data ingestion + +# Spans (distributed tracing data) +# Contains trace information showing request flow across services +spans: + # Number of parallel processing threads + # Default: GOMAXPROCS (number of CPU cores) + # Increase for high-volume tracing workloads + #max_threads: 10 + + # Batch size for database insertions + # Larger batches improve throughput but increase memory usage + # Tune based on your ingestion rate and memory constraints + #max_insert_size: 10000 + + # In-memory buffer capacity for incoming spans + # Spans are dropped when buffer is full (check metrics for drops) + # Default scales with max_threads + #max_buffered_records: 100e3 + +# Span links (relationships between spans) +# Used for connecting spans across trace boundaries +span_links: + # Uncomment to disable span link processing + # This saves resources if you don't use span links + #disabled: true - # tls: - # cert_file: config/tls/uptrace.crt - # key_file: config/tls/uptrace.key + #max_threads: 10 # Processing parallelism + #max_insert_size: 10000 # Batch size for insertions + #max_buffered_records: 100e3 # Buffer capacity + +# Application logs +# Structured and unstructured log data from applications +logs: + #max_threads: 10 # Processing parallelism + #max_insert_size: 10000 # Batch size for insertions + #max_buffered_records: 100e3 # Buffer capacity + +# Custom events +# Application-specific events and business metrics +events: + #max_threads: 10 # Processing parallelism + #max_insert_size: 10000 # Batch size for insertions + #max_buffered_records: 100e3 # Buffer capacity + +# Metrics and time series data +# Numerical measurements over time (counters, gauges, histograms) +metrics: + #max_threads: 10 # Processing parallelism + #max_insert_size: 10000 # Batch size for insertions + #max_buffered_records: 100e3 # Buffer capacity + + # Memory limit for cumulative to delta conversion + # Affects processing of cumulative counters from OpenTelemetry + #max_cumulative_timeseries: 1e6 + +# ----------------------------------------------------------------------------- +# Query & Performance Limits +# ----------------------------------------------------------------------------- +# Resource limits to prevent expensive queries from affecting system performance + +# Trace query resource limits +trace: + # Maximum number of spans to return in a single query + # Prevents UI timeouts and excessive memory usage + # Users can adjust time ranges to stay within limits + #query_limit: 200_000 + + # Maximum memory usage per query (in bytes) + # Prevents OOM errors from complex queries + # Adjust based on available system memory + #max_memory_usage_bytes: 200_000_000 + +# ----------------------------------------------------------------------------- +# Feature Modules +# ----------------------------------------------------------------------------- +# Optional features that can be enabled/disabled for performance or security + +# Monitoring and alerting system +# Provides proactive monitoring with notifications +alerting: + # Uncomment to disable the entire alerting system + # This saves resources if you don't use monitoring alerts + #disabled: true -## -## Various options for Uptrace UI. -## -site: - # Overrides public URL for Vue-powered UI in case you put Uptrace behind a proxy. - #addr: 'https://uptrace.mydomain.com' +# Service dependency graph generation +# Automatically builds service topology from trace data +service_graph: + # Uncomment to disable service graph processing + # This saves CPU and memory if you don't use the service map + #disabled: true -## -## Spans processing options. -## -spans: - # The size of the Go chan used to buffer incoming spans. - # If the buffer is full, Uptrace starts to drop spans. - #buffer_size: 100000 +# JavaScript error sourcemap processing +# Provides better error stack traces for frontend applications +# Requires internet access to download source maps from URLs +sourcemaps: + # Uncomment to disable sourcemap processing + # Disable in air-gapped environments or if not using JS error tracking + #disabled: true - # The number of spans to insert in a single query. - #batch_size: 10000 +# ----------------------------------------------------------------------------- +# External Services +# ----------------------------------------------------------------------------- +# Integration with external services and self-monitoring -## -## Metrics processing options. -## -metrics: - # List of attributes to drop for being noisy. - drop_attrs: - - telemetry_sdk_language - - telemetry_sdk_name - - telemetry_sdk_version - - # The size of the Go chan used to buffer incoming measures. - # If the buffer is full, Uptrace starts to drop measures. - #buffer_size: 100000 - - # The number of measures to insert in a single query. - #batch_size: 10000 - -## -## uptrace-go client configuration. -## Uptrace sends internal telemetry here. Defaults to listen.grpc.addr. -## -uptrace_go: - # Enabled by default. +# Internal telemetry collection +# Uptrace monitors itself and sends telemetry to the configured DSN +self_monitoring: + # Uncomment to disable self-monitoring + # This prevents Uptrace from generating its own telemetry data #disabled: true - # Defaults to the first projects. - # dsn: http://project1_secret_token@localhost:14317/1 - - # tls: - # cert_file: config/tls/uptrace.crt - # key_file: config/tls/uptrace.key - # insecure_skip_verify: true - -## -## SMTP settings to send emails. -## https://uptrace.dev/get/alerting.html -## -smtp_mailer: - enabled: true - host: mailhog - port: 1025 - username: mailhog - password: mailhog - from: 'uptrace@localhost' - -## -## Logging configuration. -## + # DSN for internal telemetry + # Format: http://project_token@host?grpc=port + # This can point to a project in this Uptrace instance or to the Uptrace Cloud + dsn: http://project1_secret@localhost:14318?grpc=14317 + + #tls: + # insecure_skip_verify: true + +# Telegram bot for notifications +# Enables sending alert notifications to Telegram channels/users +# Setup guide: https://sendpulse.com/knowledge-base/chatbot/telegram/create-telegram-chatbot +telegram: + # Telegram bot token obtained from @BotFather + # Required for sending notifications to Telegram + bot_token: '' + +# ----------------------------------------------------------------------------- +# System Configuration +# ----------------------------------------------------------------------------- +# Global system settings and licensing + +# Application logging configuration +# Controls Uptrace's own log output (not application logs) logging: - # Zap minimal logging level. - # Valid values: DEBUG, INFO, WARN, ERROR, DPANIC, PANIC, FATAL. + # Log level affects verbosity and performance + # DEBUG: Very verbose, use only for troubleshooting + # INFO: Standard operational information + # WARN: Warning messages and errors + # ERROR: Only error messages level: INFO -# Secret key that is used to sign JWT tokens etc. -secret_key: 102c1a557c314fc28198acd017960843 - -# Enable to log HTTP requests and database queries. -debug: false +# Premium features license +# Enables advanced features like distributed tables, SSO, etc. +# Details: https://uptrace.dev/get/hosted#premium-edition +license: + # Premium license key from Uptrace + # Required for enterprise features + key: ''