By using this project or its source code, for any purpose and in any shape or form, you grant your implicit agreement to all the following statements:
- You condemn Russia and its military aggression against Ukraine
- You recognize that Russia is an occupant that unlawfully invaded a sovereign state
- You support Ukraine's territorial integrity, including its claims over temporarily occupied territories of Crimea and Donbas
- You reject false narratives perpetuated by Russian state propaganda
Glory to Ukraine! 🇺🇦
This project contains example of using OpenTelemetry with .NET web applications. It uses OTEL Collector and Grafana OSS backend for dealing with data.
It consists of:
- Grafana
- Loki (using Serilog.Sinks.Grafana.Loki as a sink for projects)
- Prometheus
- Tempo
Solution consists of multiple services that use common infrastructure building blocks:
- Elasticsearch and Kibana
- MassTransit over RabbitMQ (https://www.rabbitmq.com/)
- MongoDB
- PostgreSQL with Npgsql, using EF Core and Dapper
- Redis with StackExchange.Redis
You could run solution fully in containers, using
docker compose up --build -dOr bump infrastructure up in containers with docker compose and run standalone projects in your IDE.
In both cases entry point will be available by address http://localhost:5200/swagger
Aggregating service. Available on http://localhost:5201 or via API gateway on http://localhost:5200/alpha.
Under the hood it does two requests to Epsilon service, using Refit and Mu, using MassTransit's request/response feature.
It is a good entrypoint to look how request will be routed through the system components.
Service that uses Elasticsearch. Available on http://localhost:5204 or via API gateway on http://localhost:5200/epsilon.
Data in elastic index is seeded on service launch. Currently it contains a single document, extracted by a simple filter.
Service built over MassTransit. Available on http://localhost:5203 or via API gateway on http://localhost:5200/mu.
Exposes two endpoints for sending command and publishing event. Handlers, receives this messages are in this service. Also has a handler for responding to Alpha's request via MassTransit.
Service that uses MongoDB. Available on http://localhost:5205 or via API gateway on http://localhost:5200/nu.
Data in MongoDB is seeded on service launch. Currently it contains a single document, extracted by a simple filter.
API Gateway build with Ocelot. Acts as a reverse proxy. Available on http://localhost:5200.
Also aggregates downstream services' swagger docs, using SwaggerForOcelot project.
Exposes aggregated Swagger UI & Swagger Doc on http://localhost:5200/swagger.
Service that uses PostgreSQL and Redis. Available on http://localhost:5202 or via API gateway on http://localhost:5200/sigma.
Exposes 3 endpoints:
- Getting entity by id. Using Redis over
IDistributedCachefor searching. If entity is not found - goes to SQL with EF Core - Getting all entities. Loads them from SQL with
Dapper - Creating entity. Entity is created in SQL with EF Core.
- Logs. Are passed directly to Loki, using corresponding Serilog's sink.
- Metrics. Are exported to OTEL and scrapped by Prometheus from it.
- Traces. Are exported to OTEL and passed to Tempo by OTEL.
Contributing is welcomed here. If it is something standalone (i.e. GRPC), feel free to add a new service.
It is preferable to use a corresponding letter of greek alphabet (like Gamma for GRPC).
Also if it is something small, it could be appended to the existing service.
