I’m trying to send metrics/traces from my ASP.NET Core 7 application to Grafana.
Here’s my Docker Compose file.
version: '3.4'
networks:
my-network:
name: my_network
services:
sample.restaurant.server:
image: ${DOCKER_REGISTRY-}samplerestaurantserver
build:
context: .
dockerfile: sample/Sample.Restaurant.Server/Dockerfile
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
- OTEL_EXPORTER_OTLP_ENDPOINT=grpc://otel-collector:4317
- OTEL_METRICS_EXPORTER=otlp
- OTEL_RESOURCE_ATTRIBUTES=service.name=Sample.Restaurant.Server
ports:
- 54576:80
- 54577:443
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
depends_on:
- database
- otel-collector
networks:
- my-network
otel-collector:
image: otel/opentelemetry-collector
ports:
- 4317:4317
volumes:
- ./collector-config.yml:/etc/otel-collector/collector-config.yml
networks:
- my-network
grafana:
image: grafana/grafana
restart: unless-stopped
ports:
- 3000:3000
volumes:
- grafana_data:/var/lib/grafanaa
depends_on:
- otel-collector
networks:
- my-network
volumes:
grafana_data: {}
And here’s my collector config:
receivers:
otlp:
protocols:
grpc:
exporters:
otlp:
endpoint: otel-collector:4317
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlp]
metrics:
receivers: [otlp]
exporters: [otlp]
And here’s my service collection extension method that configures OpenTelemetry
.
public static class TelemetryConfiguration
{
public static IServiceCollection AddTelemetry(this IServiceCollection services,
IWebHostEnvironment webHostEnvironment,
string telemetryNamespace)
{
services.AddOpenTelemetry()
.ConfigureResource(resource =>
{
resource
.AddService(
serviceName: webHostEnvironment.ApplicationName,
serviceNamespace: telemetryNamespace,
serviceVersion: Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "1.0.0",
serviceInstanceId: Environment.MachineName)
.AddAttributes(new Dictionary<string, object>
{
{ "deployment.environment", webHostEnvironment.EnvironmentName }
});
})
.WithMetrics(metrics =>
{
metrics
.AddAspNetCoreInstrumentation()
.AddConsoleExporter((exporterOptions, metricReaderOptions) =>
{
metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
})
.AddOtlpExporter(builder => builder.Endpoint = new Uri("http://localhost:4317"));
})
.WithTracing(tracing =>
{
tracing
.AddAspNetCoreInstrumentation()
.AddConsoleExporter()
.AddOtlpExporter(builder => builder.Endpoint = new Uri("http://localhost:4317"));
});
return services;
}
}
Firstly, is this correctly configured?
Secondly, how do I setup the data source in Grafana to receive the data from my collector?
2
Answers
The issue here is that you’re attempting to use the OpenTelemetry collector as a Datastore. It collects, processes and forwards data to datastores, so in your example, you’ll need to add a series of datastores for the various signals.
My recommendation would be:
If you want to, you can then use the free local version of Grafana to visualise things like Metrics.
For production, I’d highly recommend thinking about a SaaS solution as scaling of those can be hard if you’re not used to running lots of containers and datastores. That said, all of those OSS/Free solutions can be hosted and scaled if you choose to.
If you’re open to using Grafana Cloud for storing your data, it’s quite simple to ingest OTLP. Here’s the related documentation.
You would need to sign up for Grafana Cloud (there’s a free tier) and change your collector config according to the template below: