Skip to content

chore(shared): declarar pacotes NuGet OpenTelemetry para wiring#365

Merged
marmota-alpina merged 2 commits into
mainfrom
chore/30-otel-pacotes
May 10, 2026
Merged

chore(shared): declarar pacotes NuGet OpenTelemetry para wiring#365
marmota-alpina merged 2 commits into
mainfrom
chore/30-otel-pacotes

Conversation

@marmota-alpina
Copy link
Copy Markdown
Contributor

Resumo

Primeiro PR da entrega da Story #30 (wiring OpenTelemetry nos Program.cs). Declara em Directory.Packages.props os 5 pacotes NuGet que serão consumidos pelos PRs subsequentes — sem mudança de comportamento neste PR.

Esta entrega segue o plano de 3 PRs incrementais descrito no body da própria #30:

  1. chore(shared): declarar pacotes NuGet OpenTelemetry ← este PR. Refs story(observability): wiring de OpenTelemetry nos Program.cs #30, story(observability): Serilog sink para Loki + service.name enrichment por ambiente #105
  2. feat(observability): expandir AdicionarObservabilidade + Serilog OTLP sink + correlation_id span — refs story(observability): wiring de OpenTelemetry nos Program.cs #30, story(observability): Serilog sink para Loki + service.name enrichment por ambiente #105, story(observability): propagar correlation_id como Activity span attribute #110
  3. feat(observability): wire nos 3 Program.cs + integration testcloses story(observability): wiring de OpenTelemetry nos Program.cs #30, story(observability): Serilog sink para Loki + service.name enrichment por ambiente #105, story(observability): propagar correlation_id como Activity span attribute #110

Pacotes adicionados

Pacote Versão Justificativa
OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.3 gRPC OTLP para o Collector institucional. 1.15.3 obrigatório — 1.15.2 carrega GHSA-4625-4j76-fww9 + GHSA-mr8r-92fq-pj8p (vulnerabilidades moderadas) e o repo trata NU1902 como erro
OpenTelemetry.Instrumentation.EntityFrameworkCore 1.15.1-beta.1 Única versão publicada — biblioteca OTel ainda não estabilizou em GA. Prática estabelecida no ecossistema OTel .NET (mesmo padrão de adoção em Wolverine, MassTransit, etc.)
OpenTelemetry.Instrumentation.Http 1.15.1 Tracing/metrics de chamadas HttpClient externas
OpenTelemetry.Instrumentation.Runtime 1.15.1 Métricas de runtime .NET (GC, threadpool, exceptions, JIT)
Serilog.Sinks.OpenTelemetry 4.2.0 Logs Serilog via OTLP até Loki — desbloqueia o sink que fecha a Story #105 (PR 2). Mantém Console sink em paralelo para docker logs

Versões alinhadas

Hosting + AspNetCore continuam em 1.15.2 (last stable do trem core). Exporter foi para 1.15.3 por imposição do NU1902. As 2 instrumentações Http/Runtime ficam em 1.15.1 (não há 1.15.2 para essas duas). EF instrumentation segue o trem 1.15.x-beta.1.

Validação local

```bash
dotnet restore UniPlus.slnx # passa sem NU1902
dotnet build UniPlus.slnx # 0 warning / 0 error (TreatWarningsAsErrors)
```

Mudanças

  • Directory.Packages.props — 6 novas entradas (5 PackageVersion + 1 comentário sobre EF beta + 1 comentário sobre 1.15.3 obrigatório)
  • src/shared/Unifesspa.UniPlus.Infrastructure.Core/Unifesspa.UniPlus.Infrastructure.Core.csproj — 5 novos PackageReference
  • 15 packages.lock.json atualizados pelo dotnet restore (transitivo de Infrastructure.Core em todos os projetos consumidores)

Decisões de fundo

  • ADR-0018 (OpenTelemetry para instrumentação backend) — define a stack LGTM como destino. Ver docs/adrs/0018-opentelemetry-para-instrumentacao-do-backend.md
  • ADR-0011 (PII masking em logs) — PiiMaskingEnricher continua aplicado antes do sink OTLP no PR 2 (enrichers Serilog executam antes dos sinks por construção)
  • Não inclui OpenTelemetry.Instrumentation.Npgsql — EF Core instrumentation já cobre spans Postgres por baixo via DbCommand events
  • Não inclui alinhamento Hosting/AspNetCore para 1.15.3 — AspNetCore ainda não tem 1.15.3 publicado

Refs #30, #105

Adiciona 5 PackageVersion centralizados em Directory.Packages.props +
respectivos PackageReference em Infrastructure.Core.csproj. Lockfiles
atualizados pelo restore.

Pacotes adicionados:

- OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.3 — gRPC OTLP para
  o Collector. 1.15.3 obrigatório: 1.15.2 carrega GHSA-4625-4j76-fww9
  + GHSA-mr8r-92fq-pj8p (NU1902 como erro).
- OpenTelemetry.Instrumentation.EntityFrameworkCore 1.15.1-beta.1 —
  única opção publicada (lib OTel ainda não estabilizou); prática
  estabelecida no ecossistema OTel .NET.
- OpenTelemetry.Instrumentation.Http 1.15.1.
- OpenTelemetry.Instrumentation.Runtime 1.15.1.
- Serilog.Sinks.OpenTelemetry 4.2.0 — logs via OTLP até Loki, desbloqueia
  o sink que fecha a Story #105.

Sem mudança de comportamento neste PR: pacotes apenas declarados,
ainda não consumidos. Expansão de AdicionarObservabilidade + sink
Serilog seguem no PR 2 da entrega da Story #30; wiring nos Program.cs
+ integration test seguem no PR 3.

Refs #30, #105
marmota-alpina

This comment was marked as low quality.

Copy link
Copy Markdown
Contributor

@jf2s jf2s left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revisão: PR #365chore(shared): declarar pacotes NuGet OpenTelemetry para wiring

Tipo de PR: mecânico (declaração de pacotes, sem mudança de comportamento)
Arquivos essenciais: Directory.Packages.props (+7 linhas) + Infrastructure.Core.csproj (+5 linhas)
Arquivos transitivos: 15 packages.lock.json atualizados pelo dotnet restore

Resumo

Primeiro PR da entrega da Story #30, alinhado com o plano de 3 PRs incrementais declarado no body da issue. Declara os pacotes NuGet que serão consumidos no PR 2 (expansão da extension) e PR 3 (wiring + integration test). Versões pinadas explicitamente, justificadas com comentários inline. CI verde nos 5 checks (build/test em 3m39s, sem warning).

Findings

Bloqueantes (0)

Nenhum. PR não altera comportamento — só declara dependências.

Importantes (0)

Nenhum. Build verde com TreatWarningsAsErrors, restore sem NU1902, CI 5/5.

Sugestões (2)

[S1] Renovate/Dependabot ausente — gap pré-existente que este PR amplifica

Confirmado via git ls-tree em main que o repo não tem .github/renovate.json nem .github/dependabot.yml. Este PR introduz o primeiro prerelease (-beta.1) declarado no Directory.Packages.props central — verificado com git grep que não havia precedente. Quando OpenTelemetry.Instrumentation.EntityFrameworkCore atingir GA (1.x.0 stable), não há mecanismo automático para alguém perceber e atualizar.

Não bloqueia este PR — é gap pré-existente da infra do repo. Recomendação: abrir issue follow-up para decidir Renovate vs Dependabot e a periodicidade. Ideal antes de o Serilog.Sinks.OpenTelemetry (que tem ciclo dev/release ativo) começar a atrasar.

[S2] Ordem dos PackageVersion no bloco "Logging & Observability" — cosmético

<PackageVersion Include=\"Serilog.AspNetCore\" Version=\"10.0.0\" />
<PackageVersion Include=\"Serilog.Sinks.OpenTelemetry\" Version=\"4.2.0\" />
<PackageVersion Include=\"OpenTelemetry.Extensions.Hosting\" Version=\"1.15.2\" />
…
<PackageVersion Include=\"OpenTelemetry.Instrumentation.EntityFrameworkCore\" Version=\"1.15.1-beta.1\" />

Para ordem alfabética estrita, Serilog.Sinks.OpenTelemetry ficaria mais natural ao final do grupo Serilog (após Serilog.AspNetCore), mantendo todos os OpenTelemetry.* agrupados consecutivamente. Não justifica rework — apontamento puramente estilístico.

Pontos positivos

  • Comentários inline contextuais e acionáveis — "1.15.3 obrigatório por GHSA-..." diz exatamente por que a versão diverge do trem; "EF instrumentation só publica como beta" justifica o prerelease sem reabrir debate em revisões futuras.
  • Versões pinadas explicitamente — sem floating range; reproduzibilidade garantida.
  • PR description completa com tabela de pacotes + justificativa por linha + decisões de fundo (ADR-0011 + ADR-0018 + por que Npgsql instrumentation foi excluído).
  • Plano de 3 PRs declarado upfront — facilita review por escopo isolado e reduz risco de scope creep.
  • Validação local rodada antes do pushdotnet restore (passa sem NU1902) + dotnet build (0 warnings, 0 errors em 6.75s).
  • Resolução proativa de vulnerabilidade — descobriu o NU1902 na primeira tentativa (1.15.2), consultou gh api graphql para confirmar 1.15.3 como fix, atualizou e re-validou. Documentado no commit + PR.

Veredicto

APROVADO COM RESSALVAS

Sugestão [S1] é gap pré-existente que este PR não introduz mas amplifica — vira issue follow-up sem bloquear merge. Sugestão [S2] é puramente estilística. Nenhuma das duas justifica reabrir o PR.

PR está pronto para merge — aguardando apenas confirmação humana de que a issue follow-up de Renovate fica registrada antes do PR 2 começar a se acumular.

…trita

Move OpenTelemetry.Exporter.OpenTelemetryProtocol antes de
Extensions.Hosting (alfabeticamente E.E < E.H), e organiza as
instrumentações EntityFrameworkCore/Http/Runtime em ordem
alfabética dentro do trem 1.15.x. Comentários sobre 1.15.3
(NU1902) e beta da EF instrumentation seguem inline, agora
ancorados no símbolo de fato relevante.

Mesma reordenação aplicada em Infrastructure.Core.csproj.

Sem mudança funcional — restore + build verdes (0 warning, 0 error).

Refs #30
Copy link
Copy Markdown
Contributor

@jf2s jf2s left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aprovado. Revisão completa publicada antes (cross-account audit trail). 0 bloqueantes, 0 importantes; sugestões S1 (Renovate) virou issue follow-up #366, S2 (ordem) corrigida no commit e007082. CI 5/5 verde. Pode mergear.

@marmota-alpina marmota-alpina merged commit 7085da7 into main May 10, 2026
5 checks passed
@marmota-alpina marmota-alpina deleted the chore/30-otel-pacotes branch May 10, 2026 19:04
marmota-alpina added a commit that referenced this pull request May 10, 2026
…tions

Resolve #366 — gap pré-existente que se tornou explícito ao introduzir o
primeiro prerelease (-beta.1) no Directory.Packages.props central durante
a entrega da Story #30 (PR #365).

Decisão Dependabot vs Renovate
- Dependabot: nativo do GitHub, zero setup de App na org, suporte completo a
  Directory.Packages.props central + packages.lock.json em 17 projetos
- Renovate: mais flexível mas requer instalação da App na org unifesspa-edu-br
  (decisão de plataforma fora do escopo desta issue)

Configuração (.github/dependabot.yml)
- 2 ecosystems: nuget (root) + github-actions (root)
- Schedule semanal: segunda 06:00 BRT (timezone America/Belem) — antes do daily
- Grouping inteligente para reduzir ruído:
  - opentelemetry (OpenTelemetry.* + Serilog.Sinks.OpenTelemetry — trem único)
  - wolverine (WolverineFx*)
  - ef-core (Microsoft.EntityFrameworkCore* + Npgsql*)
  - serilog (Serilog* exceto sink OTel)
  - kafka (Confluent.* + Apache.Avro)
  - testing (xunit + AwesomeAssertions + NSubstitute + Testcontainers + ArchUnit + coverlet)
  - github-actions-all (catch-all em 1 PR)
- Major bumps SEMPRE manuais (ignored via update-types semver-major) —
  Wolverine 5→6, EF Core 10→11, .NET 10→11 exigem revisão arquitetural
- open-pull-requests-limit: 5 (NuGet) + 2 (Actions) — evita inundação
- Labels: chore + deps (NuGet) ou chore + ci (Actions); commit prefix
  chore(deps): / chore(ci):

Documentação
- Nova seção em CONTRIBUTING.md "Auto-update de dependências (Dependabot)"
  explicando schedule, grouping, tratamento dos PRs do bot e como adicionar
  novo grupo

YAML validado via python yaml.safe_load.

Closes #366
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

story(observability): wiring de OpenTelemetry nos Program.cs

2 participants