commit bd1826f14416ffcff3d0a105c541494bf63e8825 Author: Claudiu Farcas Date: Wed Oct 5 09:07:14 2022 +0300 init commit diff --git a/.dockerignore b/.dockerignore new file mode 100755 index 0000000..bdca33b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d8910c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +**/obj +**/bin +*.suo +*.user +.vs/** \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..db29a14 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,44 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Docker .NET Core Launch", + "type": "docker", + "request": "attach", + "platform": "netCore", + "sourceFileMap": { + "/src": "${workspaceFolder}" + } + }, + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/LearnCollectInst.Api/bin/Debug/net6.0/LearnCollectInst.Api.dll", + "args": [], + "cwd": "${workspaceFolder}/LearnCollectInst.Api", + "stopAtEntry": false, + // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser + "serverReadyAction": { + "action": "openExternally", + "pattern": "\\bNow listening on:\\s+(https?://\\S+)" + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..2a5427e --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/LearnCollectInst.Api/LearnCollectInst.Api.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/LearnCollectInst.Api/LearnCollectInst.Api.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/LearnCollectInst.Api/LearnCollectInst.Api.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/LearnCollectInst.Api.sln b/LearnCollectInst.Api.sln new file mode 100755 index 0000000..2c025d9 --- /dev/null +++ b/LearnCollectInst.Api.sln @@ -0,0 +1,36 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32901.215 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LearnCollectInst.Api", "LearnCollectInst.Api\LearnCollectInst.Api.csproj", "{354C8FF9-6E02-453A-9E4E-B3E5DA10EAD2}" +EndProject +Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{D62D5AEA-CF65-48FE-9F64-09AD58D39118}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{332AE074-3713-4709-AD1C-BAE8AE96886F}" + ProjectSection(SolutionItems) = preProject + otel-collector-config.yaml = otel-collector-config.yaml + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {354C8FF9-6E02-453A-9E4E-B3E5DA10EAD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {354C8FF9-6E02-453A-9E4E-B3E5DA10EAD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {354C8FF9-6E02-453A-9E4E-B3E5DA10EAD2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {354C8FF9-6E02-453A-9E4E-B3E5DA10EAD2}.Release|Any CPU.Build.0 = Release|Any CPU + {D62D5AEA-CF65-48FE-9F64-09AD58D39118}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D62D5AEA-CF65-48FE-9F64-09AD58D39118}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D62D5AEA-CF65-48FE-9F64-09AD58D39118}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D62D5AEA-CF65-48FE-9F64-09AD58D39118}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B34BFD9D-9918-488B-B186-A858E627C6AA} + EndGlobalSection +EndGlobal diff --git a/LearnCollectInst.Api/Controllers/WeatherForecastController.cs b/LearnCollectInst.Api/Controllers/WeatherForecastController.cs new file mode 100755 index 0000000..e82361f --- /dev/null +++ b/LearnCollectInst.Api/Controllers/WeatherForecastController.cs @@ -0,0 +1,42 @@ +using LearnCollectInst.Api.Model; +using Microsoft.AspNetCore.Mvc; + +namespace LearnCollectInst.Api.Controllers +{ + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet(Name = "GetWeatherForecast")] + public IEnumerable Get() + { + _logger.LogInformation("Weather forecast list started"); + + var result = Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + + // PLAYGROUND: + //throw new ArgumentException("some induced error"); + + _logger.LogWarning("Weather forecast list was generated", result.Length); + return result; + } + } +} \ No newline at end of file diff --git a/LearnCollectInst.Api/Dockerfile b/LearnCollectInst.Api/Dockerfile new file mode 100755 index 0000000..d7ad89c --- /dev/null +++ b/LearnCollectInst.Api/Dockerfile @@ -0,0 +1,22 @@ +#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base +WORKDIR /app +EXPOSE 80 +EXPOSE 443 + +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +WORKDIR /src +COPY ["LearnCollectInst.Api/LearnCollectInst.Api.csproj", "LearnCollectInst.Api/"] +RUN dotnet restore "LearnCollectInst.Api/LearnCollectInst.Api.csproj" +COPY . . +WORKDIR "/src/LearnCollectInst.Api" +RUN dotnet build "LearnCollectInst.Api.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "LearnCollectInst.Api.csproj" -c Release -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "LearnCollectInst.Api.dll"] \ No newline at end of file diff --git a/LearnCollectInst.Api/LearnCollectInst.Api.csproj b/LearnCollectInst.Api/LearnCollectInst.Api.csproj new file mode 100755 index 0000000..d7fe2d0 --- /dev/null +++ b/LearnCollectInst.Api/LearnCollectInst.Api.csproj @@ -0,0 +1,27 @@ + + + + net6.0 + enable + enable + 7d6d27cc-c904-4577-8fa3-cbcb1c306626 + Linux + ..\docker-compose.dcproj + + + + + + + + + + + + + + + + + + diff --git a/LearnCollectInst.Api/Model/WeatherForecast.cs b/LearnCollectInst.Api/Model/WeatherForecast.cs new file mode 100755 index 0000000..7a73dbe --- /dev/null +++ b/LearnCollectInst.Api/Model/WeatherForecast.cs @@ -0,0 +1,13 @@ +namespace LearnCollectInst.Api.Model +{ + public class WeatherForecast + { + public DateTime Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } + } +} \ No newline at end of file diff --git a/LearnCollectInst.Api/Program.cs b/LearnCollectInst.Api/Program.cs new file mode 100755 index 0000000..d8bf6d3 --- /dev/null +++ b/LearnCollectInst.Api/Program.cs @@ -0,0 +1,91 @@ +using OpenTelemetry.Exporter; +using OpenTelemetry.Instrumentation.AspNetCore; +using OpenTelemetry.Logs; +using OpenTelemetry.Metrics; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; +using System.Diagnostics; + +// Define some important constants to initialize tracing with +var serviceName = "LearnCollectInst.Api"; +var serviceVersion = "1.0.0"; + +var resBuilder = ResourceBuilder.CreateDefault() + .AddService(serviceName: serviceName, serviceVersion: serviceVersion); + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + + +// OLTP tracing +builder.Services.AddOpenTelemetryTracing(tracerProviderBuilder => +{ + tracerProviderBuilder + .AddConsoleExporter() + .AddSource(serviceName) + .SetResourceBuilder(resBuilder) + .AddHttpClientInstrumentation() + .AddAspNetCoreInstrumentation() + .AddSqlClientInstrumentation() + .AddOtlpExporter(config => + { + config.Endpoint = new Uri("http://otel-collector:4317"); + }) + .AddConsoleExporter(); +}); + +// OTPL metrics +builder.Services.AddOpenTelemetryMetrics(config => +{ + config.SetResourceBuilder(resBuilder); + config.AddRuntimeInstrumentation() + .AddHttpClientInstrumentation() + .AddAspNetCoreInstrumentation(); + config.AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri("http://otel-collector:4317"); + }).AddConsoleExporter(); +}); + +// OTLP logger +builder.Host.ConfigureLogging(logging => + logging.ClearProviders() + .AddOpenTelemetry(options => + { + options.SetResourceBuilder(resBuilder); + // Export the body of the message + options.IncludeFormattedMessage = true; + options.IncludeScopes = true; + options.ParseStateValues = true; + // exporters + options.AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri("http://otel-collector:4317"); + }) + .AddConsoleExporter(); + }) +); + + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +// if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +//app.UseHttpsRedirection(); + +app.UseAuthorization(); +app.MapControllers(); +// app.UseHttpLogging(); + +var MyActivitySource = new ActivitySource(serviceName); + +app.Run(); diff --git a/LearnCollectInst.Api/Properties/launchSettings.json b/LearnCollectInst.Api/Properties/launchSettings.json new file mode 100755 index 0000000..8faa8a5 --- /dev/null +++ b/LearnCollectInst.Api/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "profiles": { + "LearnCollectInst.Api": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "https://localhost:7090;http://localhost:5090" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Docker": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", + "publishAllPorts": true, + "useSSL": true + } + }, + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:20591", + "sslPort": 44330 + } + } +} \ No newline at end of file diff --git a/LearnCollectInst.Api/appsettings.Development.json b/LearnCollectInst.Api/appsettings.Development.json new file mode 100755 index 0000000..ff66ba6 --- /dev/null +++ b/LearnCollectInst.Api/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/LearnCollectInst.Api/appsettings.json b/LearnCollectInst.Api/appsettings.json new file mode 100755 index 0000000..4d56694 --- /dev/null +++ b/LearnCollectInst.Api/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/docker-compose.dcproj b/docker-compose.dcproj new file mode 100755 index 0000000..8a8d240 --- /dev/null +++ b/docker-compose.dcproj @@ -0,0 +1,18 @@ + + + + 2.1 + Linux + d62d5aea-cf65-48fe-9f64-09ad58d39118 + LaunchBrowser + {Scheme}://localhost:{ServicePort}/swagger + learncollectinst.api + + + + docker-compose.yml + + + + + \ No newline at end of file diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100755 index 0000000..cf4fa2d --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,13 @@ +version: '3.4' + +services: + learncollectinst.api: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - ASPNETCORE_URLS=https://+:443;http://+:80 + ports: + - "80" + - "443" + volumes: + - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro + - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100755 index 0000000..b31a42d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,99 @@ +version: '3.4' + +services: + learncollectinst.api: + image: ${DOCKER_REGISTRY-}learncollectinstapi + build: + context: . + dockerfile: LearnCollectInst.Api/Dockerfile + ports: + - "5100:80" + depends_on: + - otel-collector + + # Jaeger + jaeger: + image: jaegertracing/all-in-one:latest + ports: + - "16686:16686" + - "14268" + - "14250" + + # Zipkin + zipkin-learn: + image: openzipkin/zipkin:latest + ports: + - "9422:9411" #default 9411 + + otel-collector: + image: otel/opentelemetry-collector-contrib:0.61.0 + command: [ "--config=/etc/otel-collector-config.yaml" ] + restart: on-failure + user: '0:0' # required for logs + volumes: + - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml + - ./otelcol_data.log:/tmp/otelcol_data.log + ports: + - "13133:13133" # health_check extension + - '4317:4317' # OLTP gRPC receiver + - '4318:4318' # OLTP HTTP receiver + - '55679:55679' # zPages + depends_on: + - jaeger + - zipkin-learn + # Prometheus + #prometheus: + # container_name: prometheus + # image: prom/prometheus:latest + # volumes: + # - ./prometheus.yaml:/etc/prometheus/prometheus.yml + # ports: + # - "9090:9090" + + clickhouse: + image: clickhouse/clickhouse-server:22.9 + restart: on-failure + environment: + CLICKHOUSE_DB: uptrace + healthcheck: + test: + [ + 'CMD', + 'wget', + '--spider', + '-q', + 'localhost:8123/ping' + ] + interval: 1s + timeout: 1s + retries: 30 + volumes: + - ch_data:/var/lib/clickhouse + ports: + - '8123:8123' + - '9000:9000' + extra_hosts: + - 'host.docker.internal:host-gateway' + + uptrace: + image: 'uptrace/uptrace:latest' + #image: 'uptrace/uptrace-dev:latest' + volumes: + - uptrace_data:/var/lib/uptrace + - ./uptrace.yml:/etc/uptrace/uptrace.yml + #environment: + # - DEBUG=2 + ports: + - '14317:14317' + - '14318:14318' + depends_on: + clickhouse: + condition: service_healthy + +volumes: + uptrace_data: + driver: local + ch_data: + driver: local + alertmanager_data: + driver: local diff --git a/otel-collector-config.yaml b/otel-collector-config.yaml new file mode 100755 index 0000000..91c297f --- /dev/null +++ b/otel-collector-config.yaml @@ -0,0 +1,64 @@ +receivers: + otlp: + protocols: + grpc: + http: + hostmetrics: + collection_interval: 10s + scrapers: + cpu: + disk: + load: + filesystem: + memory: + network: + paging: + +exporters: + jaeger: + endpoint: jaeger:14250 + tls: + insecure: true + logging: + logLevel: debug + zipkin: + endpoint: "http://zipkin-learn:9411/api/v2/spans" + file: + path: /tmp/otelcol_data.log + format: json + otlp: + endpoint: uptrace:14317 + tls: + insecure: true + headers: { "uptrace-dsn": "http://project2_secret_token@localhost:14317/2" } + +processors: + batch: + +extensions: + health_check: + pprof: + endpoint: 0.0.0.0:1777 + zpages: + endpoint: 0.0.0.0:55679 + +service: + extensions: [health_check, pprof, zpages] + telemetry: + logs: + level: debug + # metrics: + # level: detailed + pipelines: + traces: + receivers: [otlp] + exporters: [otlp, zipkin, jaeger, logging] + processors: [batch] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp, logging] #prometheus + logs: + receivers: [otlp] + processors: [] + exporters: [otlp, logging, file] diff --git a/otelcol_data.log b/otelcol_data.log new file mode 100644 index 0000000..e69de29 diff --git a/uptrace.yml b/uptrace.yml new file mode 100644 index 0000000..994102c --- /dev/null +++ b/uptrace.yml @@ -0,0 +1,247 @@ +## +## 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 +## + +## +## 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 + + # Other projects can be used to monitor your applications. + # To monitor micro-services or multiple related services, use a single project. + - id: 2 + name: LearnCollectInst.Api + token: project2_secret_token + pinned_attrs: + - service.name + - host.name + - deployment.environment + +## +## To require authentication, uncomment the following section. +## +auth: + # users: + # - username: uptrace + # password: uptrace + # - username: admin + # password: admin + + # # Cloudflare user provider: uses 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 + # # The OIDC UserInfo claim to use as the user's username. + # # Defaults to 'preferred_username'. + # claim: preferred_username + +## +## ClickHouse database credentials. +## +ch: + # Connection string for ClickHouse database. For example: + # clickhouse://:@:/?sslmode=disable + # + # See https://clickhouse.uptrace.dev/guide/golang-clickhouse.html#options + dsn: "clickhouse://default:@clickhouse:9000/uptrace?sslmode=disable" + +## +## Alerting rules for monitoring metrics. +## +## See https://uptrace.dev/get/alerting.html for details. +## +alerting: + rules: + - name: Network errors + metrics: + - system.network.errors as $net_errors + query: + - $net_errors > 0 group by host.name + # for the last 5 minutes + for: 5m + # in the project id=1 + projects: [1] + + - name: Filesystem usage >= 90% + metrics: + - system.filesystem.usage as $fs_usage + query: + - group by host.name + - group by device + - where device !~ "loop" + - $fs_usage{state="used"} / $fs_usage >= 0.9 + for: 5m + projects: [1] + + - name: Uptrace is dropping spans + metrics: + - uptrace.projects.spans as $spans + query: + - $spans{type=dropped} > 0 + for: 1m + projects: [1] + + - name: Always firing (for fun and testing) + metrics: + - process.runtime.go.goroutines as $goroutines + query: + - $goroutines >= 0 group by host.name + for: 1m + projects: [1] + + # Create alerts from error logs and span events. + create_alerts_from_spans: + enabled: true + labels: + alert_kind: error + +## +## AlertManager client configuration. +## See https://uptrace.dev/get/alerting.html for details. +## +## Note that this is NOT an AlertManager config and you need to configure AlertManager separately. +## See https://prometheus.io/docs/alerting/latest/configuration/ for details. +## +alertmanager_client: + # AlertManager API endpoints that Uptrace uses to manage alerts. + urls: + - "http://alertmanager:9093/api/v2/alerts" + +## +## 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) + + # Whether to use ReplicatedMergeTree instead of MergeTree. + replicated: false + + # Cluster name for Distributed tables and ON CLUSTER clause. + #cluster: uptrace1 + + spans: + storage_policy: "default" + # Delete spans data after 30 days. + ttl_delete: 30 DAY + + metrics: + storage_policy: "default" + # Delete metrics data after 90 days. + ttl_delete: 90 DAY + +## +## Addresses on which Uptrace receives gRPC and HTTP requests. +## +listen: + # OTLP/gRPC API. + grpc: + addr: ":14317" + # tls: + # cert_file: config/tls/uptrace.crt + # key_file: config/tls/uptrace.key + + # OTLP/HTTP API and Uptrace API with UI. + http: + addr: ":14318" + # tls: + # cert_file: config/tls/uptrace.crt + # key_file: config/tls/uptrace.key + +## +## 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' + +## +## 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 + + # The number of spans to insert in a single query. + #batch_size: 10000 + +## +## 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 + +## +## SQLite/PostgreSQL db that is used to store metadata such us metric names, dashboards, alerts, +## and so on. +## +db: + # Either sqlite or postgres. + driver: sqlite + # Database connection string. + # + # Uptrace automatically creates SQLite database file in the current working directory. + # Make sure the directory is writable by Uptrace process. + dsn: "file:uptrace.sqlite3?_pragma=foreign_keys(1)&_pragma=busy_timeout(1000)" + +# Secret key that is used to sign JWT tokens etc. +secret_key: 102c1a557c314fc28198acd017960843 + +# Enable to log HTTP requests and database queries. +debug: false