[ 
https://issues.apache.org/jira/browse/CAMEL-24051?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18096143#comment-18096143
 ] 

Federico Mariani commented on CAMEL-24051:
------------------------------------------

Good point, but I still think the observability test infra service makes some 
sense, in particular:
* Is much closer to a production (k8s/ocp) scenario
* While TUI traces and jaeger already handle the traces, with the observability 
test infra we can:
** Validate that the metrics integration with prometheus works
** Validate OTLP log export
** And Perses, a unified UI

> camel-test-infra: add an "observability" service (Prometheus + VictoriaTraces 
> + VictoriaLogs + Perses, Apache-2.0 stack) for local dev and E2E, mirroring 
> OpenShift's observability stack
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24051
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24051
>             Project: Camel
>          Issue Type: New Feature
>          Components: test-infra
>            Reporter: Federico Mariani
>            Assignee: Federico Mariani
>            Priority: Major
>
> h3. Problem / Motivation
> Camel's local dev loop ({{camel run --dev}}) and the Kubernetes export path 
> already wire up {{camel-observability-services}} (Micrometer/Prometheus 
> metrics, health checks, OpenTelemetry tracing via the bundled 
> {{camel-opentelemetry2}}) when targeting Kubernetes/OpenShift. However, there 
> is no local backend to receive or visualize that telemetry: {{camel infra 
> run}} can start backing services like Postgres or Artemis, but nothing 
> analogous exists for observability.
> As a result, developers only find out whether traces, metrics, and logs 
> actually work correctly (correct span correlation, meaningful dashboards, 
> sane metric cardinality, etc.) once the application is deployed to a real 
> OpenShift cluster, which typically provides the Red Hat build of 
> OpenTelemetry, the Tempo Operator, Loki/OpenShift Logging, and the Cluster 
> Observability Operator (Grafana). Telemetry problems surface late, in a 
> shared cluster environment, rather than at dev/E2E time on a laptop or in CI.
> h3. Licensing note (why not grafana/otel-lgtm)
> The obvious candidate for this is Grafana's {{grafana/otel-lgtm}} all-in-one 
> image. It was *ruled out*: Grafana, Loki, and Tempo were relicensed from 
> Apache 2.0 to AGPLv3 in 2021. AGPLv3 is Category X on the ASF's third-party 
> license policy, so an ASF project cannot depend on it even as opt-in test/dev 
> tooling without a real [email protected] sign-off, and Red Hat's OSPO 
> treats AGPL as off-limits even more strictly, including for test-only tooling 
> in downstream builds. Only Prometheus and the OpenTelemetry Collector in that 
> bundle are actually Apache 2.0.
> h3. Proposed Solution -- Apache-2.0-only stack (validated with a working PoC, 
> see below)
> Use an equivalent stack built entirely from Apache-2.0-licensed components:
> * *Metrics*: Prometheus (unchanged -- already Apache 2.0, already the 
> {{camel-observability-services}} default via {{/observe/metrics}}).
> * *Traces*: https://github.com/VictoriaMetrics/VictoriaTraces[VictoriaTraces] 
> (Apache 2.0) -- ingests OTLP natively and exposes a Jaeger Query 
> Service-compatible JSON API. Functionally a drop-in swap for Tempo.
> * *Logs*: https://github.com/VictoriaMetrics/VictoriaLogs[VictoriaLogs] 
> (Apache 2.0) -- LogsQL query language, accepts OTLP logs directly via 
> {{/insert/opentelemetry/v1/logs}}. Swap for Loki.
> * *Dashboard*: https://perses.dev[Perses] (Apache 2.0, CNCF sandbox project) 
> -- dashboard-as-code tool backed by Amadeus/SAP/Red Hat, and notably *already 
> powers OpenShift's own new traces UI*, which makes it a much safer downstream 
> bet than Grafana. Its default plugin set already ships Prometheus, Jaeger, 
> and VictoriaLogs datasource kinds with no extra plugin install.
> Adding this also revisits the fate of the existing 
> {{camel-test-infra-jaeger}} module (added in CAMEL-23641): since 
> VictoriaTraces exposes a Jaeger-compatible query API, 
> {{camel-test-infra-jaeger}} does *not* need to be deprecated as originally 
> floated -- it can keep serving its current role, or the new service can point 
> at it directly, instead of being replaced outright. This should be decided 
> during implementation, not assumed here.
> h3. Signal-level design rationale (matching real K8s/OCP behavior where it 
> matters)
> * *Traces -- push*: matches OCP's own model (Red Hat build of OpenTelemetry 
> pushes OTLP spans to a Collector). No divergence between local and cluster 
> behavior.
> * *Metrics -- pull*: OCP's real default is Prometheus scraping via 
> {{ServiceMonitor}}/{{PodMonitor}}, not app-side push. 
> {{camel-observability-services}}' existing Prometheus-pull default already 
> matches this -- the local service's job is to supply a scrape target pointed 
> at the running app, mirroring what a {{ServiceMonitor}} does on-cluster, 
> *not* to switch metrics to OTLP push.
> * *Logs -- local shortcut, not literal OCP parity*: real OpenShift logging 
> does not have the app push logs at all -- Vector tails container 
> stdout/stderr and ships to LokiStack; Loki itself still doesn't natively 
> ingest OTLP. Locally, pushing OTLP logs straight from the OpenTelemetry Java 
> agent's logback/log4j2 instrumentation into VictoriaLogs is validated and 
> simple, but it is a different data path than production and should be 
> documented as a pragmatic local-dev shortcut, not a faithful mirror of the 
> cluster's log-collection mechanism.
> * *Trace/log correlation*: validated to work *automatically* via the OTel 
> Java agent's logback-appender instrumentation 
> ({{-Dotel.instrumentation.logback-appender.enabled=true}}) -- every ingested 
> log line carries real {{trace_id}}/{{span_id}} with zero app-side MDC 
> configuration. The {{camel-mdc}}-based approach documented in 
> {{camel-opentelemetry2}}'s docs is not required for this path.
> h3. Empirical validation (PoC results)
> A working proof-of-concept was built and torn down; all 4 signals (metrics, 
> traces, logs, and trace/log correlation) were confirmed working end-to-end 
> with real data from a real {{camel-observability-services}}-enabled Camel 
> route, and Perses accepted all 3 datasource definitions with no schema 
> errors. Key findings to carry into implementation:
> * VictoriaTraces' OTLP gRPC receiver is *disabled by default* -- must pass 
> {{-otlpGRPCListenAddr=:4317 -otlpGRPC.tls=false}}.
> * VictoriaTraces' Jaeger-compatible API is served at 
> {{/select/jaeger/api/...}}, not the bare {{/api/...}} its docs imply.
> * *Port collision*: Perses defaults to port 8080, the same default port used 
> by Camel/Spring Boot/Quarkus apps. Fix is to remap Perses, not the app -- 
> confirmed via {{-web.listen-address :3000}} (also verified live), keeping the 
> app on its normal default port. Suggest defaulting the test-infra service to 
> port 3000 for Perses, matching the Grafana/otel-lgtm convention devs may 
> already be used to.
> * Minimal working docker commands (see also PoC files, not retained beyond 
> this session):
> {code}
> docker network create camel-obs
> docker run -d --name victoria-traces --network camel-obs -p 8428:8428 -p 
> 4317:4317 \
>   victoriametrics/victoria-traces:latest -httpListenAddr=:8428 
> -otlpGRPCListenAddr=:4317 -otlpGRPC.tls=false
> docker run -d --name victoria-logs --network camel-obs -p 9428:9428 \
>   victoriametrics/victoria-logs:latest -httpListenAddr=:9428
> docker run -d --name prometheus --network camel-obs -p 9090:9090 \
>   -v "$(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml:ro" 
> --add-host=host.docker.internal:host-gateway \
>   prom/prometheus:latest
> docker run -d --name perses --network camel-obs -p 3000:3000 \
>   persesdev/perses:latest -web.listen-address :3000
> {code}
> * A minimal {{camel-observability-services}}-enabled JBang app, run via 
> {{camel run}} (a bare {{RouteBuilder}} has no {{main}}, so plain {{jbang 
> run}} does not work), with the OpenTelemetry Java agent supplying traces+logs 
> export, confirmed all of: Prometheus scraping {{/observe/metrics}}, a real 
> Camel-level {{timer}} span in VictoriaTraces, and OTLP log ingestion into 
> VictoriaLogs correlated back to that trace.
> h3. Scope
> * New test-infra module/service(s) following existing test-infra patterns 
> (e.g. {{*InfraService}}, {{*LocalContainerService}}, {{*ServiceFactory}}), 
> composing the *4 separate containers* above -- there is no single prebuilt 
> image bundling Prometheus + VictoriaTraces + VictoriaLogs + Perses the way 
> {{grafana/otel-lgtm}} bundles its stack.
> * Wire the new service into the {{camel-jbang-core}} {{infra}} command so 
> {{camel infra run observability}} works like other {{camel infra run 
> <service>}} commands, including supplying the Prometheus scrape-target wiring 
> against the running app.
> * Decide the relationship to the existing {{camel-test-infra-jaeger}} module 
> (coexist vs. supersede) as part of implementation.
> * Out of scope for this ticket: changes to {{camel-observability-services}}' 
> default export behavior itself (e.g. any future default-on 
> MDC/log-correlation improvement is a separate, runtime-behavior-changing 
> ticket), and cluster-side OpenShift/Kubernetes tooling (traits, {{camel 
> kubernetes doctor}}, PodMonitor/PrometheusRule generation).
> h3. Open items
> * Perses' live query-through-datasource-proxy path was not confirmed during 
> the PoC (datasource definitions were accepted, but querying data through 
> Perses' proxy returned errors under the guessed path conventions) -- needs 
> checking against Perses source/docs during implementation.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to