When running the aspire dashboard container and dotnet api container separately, I am able to get logs show up on the aspire dashboard.
However, when using docker-compose I don’t get any of the logs come through to the dashboard.
All containers run and I can access the swagger page to make api calls.
The api just creates an order:
<code>using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace TelemetryPrometheus.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class OrderController(ILogger<OrderController> logger, OrderRepository orderRepository) : ControllerBase
{
[HttpPost]
public async Task<Guid> Create(int userId, [FromBody] Product product, int storeId, int quantity)
{
Order newOrder = orderRepository.AddOrder(userId, product, storeId, quantity);
logger.LogInformation("Order created: {OrderId}", newOrder.Id);
await orderRepository.SaveAsync();
return newOrder.Id;
}
}
}
</code>
<code>using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace TelemetryPrometheus.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class OrderController(ILogger<OrderController> logger, OrderRepository orderRepository) : ControllerBase
{
[HttpPost]
public async Task<Guid> Create(int userId, [FromBody] Product product, int storeId, int quantity)
{
Order newOrder = orderRepository.AddOrder(userId, product, storeId, quantity);
logger.LogInformation("Order created: {OrderId}", newOrder.Id);
await orderRepository.SaveAsync();
return newOrder.Id;
}
}
}
</code>
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace TelemetryPrometheus.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class OrderController(ILogger<OrderController> logger, OrderRepository orderRepository) : ControllerBase
{
[HttpPost]
public async Task<Guid> Create(int userId, [FromBody] Product product, int storeId, int quantity)
{
Order newOrder = orderRepository.AddOrder(userId, product, storeId, quantity);
logger.LogInformation("Order created: {OrderId}", newOrder.Id);
await orderRepository.SaveAsync();
return newOrder.Id;
}
}
}
program.cs:
<code>builder.Services.AddOpenTelemetry()
.WithMetrics(MetricsBuilderExtensions =>
{
MetricsBuilderExtensions.AddMeter("Microsoft.AspNetCore.Hosting");
MetricsBuilderExtensions.AddMeter("Microsoft.AspNetCore.Server.Kestrel");
MetricsBuilderExtensions.AddMeter("System.Net.Http");
MetricsBuilderExtensions.AddPrometheusExporter();
MetricsBuilderExtensions.AddOtlpExporter();
});
builder.Logging.AddOpenTelemetry(options =>
{
options.AddConsoleExporter();
options.AddOtlpExporter();
});
</code>
<code>builder.Services.AddOpenTelemetry()
.WithMetrics(MetricsBuilderExtensions =>
{
MetricsBuilderExtensions.AddMeter("Microsoft.AspNetCore.Hosting");
MetricsBuilderExtensions.AddMeter("Microsoft.AspNetCore.Server.Kestrel");
MetricsBuilderExtensions.AddMeter("System.Net.Http");
MetricsBuilderExtensions.AddPrometheusExporter();
MetricsBuilderExtensions.AddOtlpExporter();
});
builder.Logging.AddOpenTelemetry(options =>
{
options.AddConsoleExporter();
options.AddOtlpExporter();
});
</code>
builder.Services.AddOpenTelemetry()
.WithMetrics(MetricsBuilderExtensions =>
{
MetricsBuilderExtensions.AddMeter("Microsoft.AspNetCore.Hosting");
MetricsBuilderExtensions.AddMeter("Microsoft.AspNetCore.Server.Kestrel");
MetricsBuilderExtensions.AddMeter("System.Net.Http");
MetricsBuilderExtensions.AddPrometheusExporter();
MetricsBuilderExtensions.AddOtlpExporter();
});
builder.Logging.AddOpenTelemetry(options =>
{
options.AddConsoleExporter();
options.AddOtlpExporter();
});
Here’s my docker-compose file:
<code>version: '3.8'
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
aspire-dashboard:
image: mcr.microsoft.com/dotnet/aspire-dashboard:8.0.0
ports:
- "18888:18888"
- "18889:4317"
container_name: aspire-dashboard
stdin_open: true
tty: true
depends_on:
- order-api
volumes:
- ./data-protection-keys:/home/app/.aspnet/DataProtection-Keys
environment:
- ASPNETCORE_ENVIRONMENT=Development
- DOTNET_DataProtection__PersistKeysToFileSystem=/home/app/.aspnet/DataProtection-Keys
- DOTNET_DataProtection__ProtectKeysWithCertificate=thumbprint
order-api:
build:
context: ./TelemetryPrometheus
dockerfile: Dockerfile
container_name: order-api
ports:
- "5000:80"
environment:
- ASPNETCORE_ENVIRONMENT=Development
labels:
- "Docker"
stdin_open: true
tty: true
networks:
default:
driver: bridge
</code>
<code>version: '3.8'
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
aspire-dashboard:
image: mcr.microsoft.com/dotnet/aspire-dashboard:8.0.0
ports:
- "18888:18888"
- "18889:4317"
container_name: aspire-dashboard
stdin_open: true
tty: true
depends_on:
- order-api
volumes:
- ./data-protection-keys:/home/app/.aspnet/DataProtection-Keys
environment:
- ASPNETCORE_ENVIRONMENT=Development
- DOTNET_DataProtection__PersistKeysToFileSystem=/home/app/.aspnet/DataProtection-Keys
- DOTNET_DataProtection__ProtectKeysWithCertificate=thumbprint
order-api:
build:
context: ./TelemetryPrometheus
dockerfile: Dockerfile
container_name: order-api
ports:
- "5000:80"
environment:
- ASPNETCORE_ENVIRONMENT=Development
labels:
- "Docker"
stdin_open: true
tty: true
networks:
default:
driver: bridge
</code>
version: '3.8'
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
aspire-dashboard:
image: mcr.microsoft.com/dotnet/aspire-dashboard:8.0.0
ports:
- "18888:18888"
- "18889:4317"
container_name: aspire-dashboard
stdin_open: true
tty: true
depends_on:
- order-api
volumes:
- ./data-protection-keys:/home/app/.aspnet/DataProtection-Keys
environment:
- ASPNETCORE_ENVIRONMENT=Development
- DOTNET_DataProtection__PersistKeysToFileSystem=/home/app/.aspnet/DataProtection-Keys
- DOTNET_DataProtection__ProtectKeysWithCertificate=thumbprint
order-api:
build:
context: ./TelemetryPrometheus
dockerfile: Dockerfile
container_name: order-api
ports:
- "5000:80"
environment:
- ASPNETCORE_ENVIRONMENT=Development
labels:
- "Docker"
stdin_open: true
tty: true
networks:
default:
driver: bridge