feat: add MatchedRoute and State support for telemetry - #508
Merged
regyssilveira merged 1 commit intoJul 9, 2026
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Suporte a telemetria
Descrição
Este Pull Request introduz o suporte básico de infraestrutura no Core do Horse para viabilizar a criação de middlewares de telemetria e observabilidade distribuída externos (como
horse-opentelemetryouhorse-prometheus).Seguindo os princípios KISS e de baixo acoplamento, o Core do Horse foi modificado estritamente com o mínimo necessário para suportar o rastreamento de rotas e a propagação de contextos de requisição de forma thread-safe, mantendo a compatibilidade do compilador do Delphi XE7 em diante e do Lazarus (FPC).
🛠️ Alterações no Core
1.
THorseRequest(src/Horse.Request.pas)MatchedRoute: string: armazena o template da rota original cadastrado no roteador (ex:/usuarios/:id). Isso é essencial para que coletores de métricas agrupem requisições sem causar explosão de cardinalidade nos bancos de dados de séries temporais (como o Prometheus).State: TObjectDictionary<string, TObject>: um dicionário de estado genérico específico por requisição. Ele permite que middlewares injetem e compartilhem objetos (como contextos de Span/Trace) durante o ciclo de vida da chamada, de forma isolada por thread.Clear(reciclagem no pool de requisições). A flag[doOwnsValues]garante a liberação automática de objetos no dicionário de estados, prevenindo qualquer vazamento de memória.2. Roteadores (
src/Horse.Core.Router.Radix.pasesrc/Horse.Core.RouterTree.pas)MatchedRoutedoTHorseRequestassim que o casamento da rota é executado com sucesso.🧪 Testes de Unidade Adicionados
Para garantir a estabilidade das alterações e evitar regressões:
Tests.Horse.Request.Recycle.pas: Adicionado o testeTestRequestStateAndMatchedRouteCycleque valida a correta atribuição deMatchedRoute, o armazenamento de objetos emStatee a destruição/limpeza automática dos mesmos ao reciclar a requisição no pool.Tests.Horse.Core.Router.Radix.paseTests.Horse.Core.RouterTree.pas: Atualizado o teste de rotas parametrizadas para validar que oReq.MatchedRouteretorna o template original/users/:id.🚀 Validação e Performance
Default,Default+Radix,HttpSys,IOCP).MatchedRouteopera apenas sobre referências de strings (custo quase nulo), e o dicionárioStatevazia consome apenas ciclos insignificantes de CPU durante a reciclagem, não impactando a performance de requisições que não utilizam telemetria.