Some checks failed
CI / build (push) Successful in 5m28s
CI / docker (push) Successful in 42s
CI / deploy (push) Successful in 23s
SonarQube Analysis / sonarqube (push) Successful in 6m50s
Nightly Soak Test / soak (push) Failing after 36m12s
Camel Version Compatibility / compat (4.0.6) (push) Successful in 2m22s
Camel Version Compatibility / compat (4.1.0) (push) Successful in 2m23s
Camel Version Compatibility / compat (4.10.9) (push) Successful in 2m25s
Camel Version Compatibility / compat (4.11.0) (push) Successful in 2m26s
Camel Version Compatibility / compat (4.12.0) (push) Successful in 2m24s
Camel Version Compatibility / compat (4.13.0) (push) Successful in 2m26s
Camel Version Compatibility / compat (4.14.5) (push) Successful in 2m24s
Camel Version Compatibility / compat (4.15.0) (push) Successful in 2m27s
Camel Version Compatibility / compat (4.16.0) (push) Successful in 2m23s
Camel Version Compatibility / compat (4.17.0) (push) Successful in 2m26s
Camel Version Compatibility / compat (4.18.1) (push) Successful in 2m23s
Camel Version Compatibility / compat (4.2.0) (push) Successful in 2m25s
Camel Version Compatibility / compat (4.3.0) (push) Successful in 2m22s
Camel Version Compatibility / compat (4.4.5) (push) Successful in 2m27s
Camel Version Compatibility / compat (4.5.0) (push) Successful in 2m20s
Camel Version Compatibility / compat (4.6.0) (push) Successful in 2m23s
Camel Version Compatibility / compat (4.7.0) (push) Successful in 2m15s
Camel Version Compatibility / compat (4.8.9) (push) Successful in 2m19s
Camel Version Compatibility / quarkus-compat (3.11.0) (push) Successful in 1m5s
Camel Version Compatibility / quarkus-compat (3.12.0) (push) Successful in 1m9s
Camel Version Compatibility / compat (4.9.0) (push) Successful in 3m6s
Camel Version Compatibility / quarkus-compat (3.13.0) (push) Successful in 1m8s
Camel Version Compatibility / quarkus-compat (3.14.0) (push) Successful in 1m24s
Camel Version Compatibility / quarkus-compat (3.15.0) (push) Successful in 1m29s
Camel Version Compatibility / quarkus-compat (3.16.0) (push) Successful in 1m39s
Camel Version Compatibility / quarkus-compat (3.17.0) (push) Successful in 1m28s
Camel Version Compatibility / quarkus-compat (3.18.0) (push) Successful in 1m58s
Camel Version Compatibility / quarkus-compat (3.19.0) (push) Successful in 1m53s
Camel Version Compatibility / quarkus-compat (3.20.0) (push) Successful in 1m15s
Camel Version Compatibility / quarkus-compat (3.22.0) (push) Successful in 1m24s
Camel Version Compatibility / quarkus-compat (3.23.0) (push) Successful in 1m20s
Camel Version Compatibility / quarkus-compat (3.24.0) (push) Successful in 1m29s
Camel Version Compatibility / quarkus-compat (3.25.0) (push) Successful in 1m25s
Camel Version Compatibility / quarkus-compat (3.26.0) (push) Successful in 1m25s
Camel Version Compatibility / quarkus-compat (3.27.0) (push) Successful in 1m21s
Camel Version Compatibility / quarkus-compat (3.29.0) (push) Successful in 1m22s
Camel Version Compatibility / quarkus-compat (3.30.0) (push) Successful in 1m31s
Camel Version Compatibility / quarkus-compat (3.31.0) (push) Successful in 1m28s
Camel Version Compatibility / quarkus-compat (3.32.0) (push) Successful in 1m29s
Camel Version Compatibility / quarkus-compat (3.33.0) (push) Successful in 1m26s
Camel Version Compatibility / report (push) Successful in 12s
Documents the six live-tunable export knobs added to ApplicationConfig so the server and SaaS teams can wire them into the app-config store, admin UI, and config-update SSE signer without guessing at semantics. - PROTOCOL.md §8 agent-config properties table gets the six new keys - PROTOCOL.md config-envelope example shows the new fields in context - PROTOCOL.md §27 (new): field reference, DROP vs BLOCK semantics, drain-on-threshold explanation, tuning-from-metrics playbook, and a server/saas integration checklist (storage, validation, UI, signing, backwards compat, observability) - docs/architecture.md: collector intermediate-chunking paragraph now points at flushRecordThreshold; new paragraph references PROTOCOL §27 for the full tuning contract No code changes. Defers drain-cap follow-up to gitea #79 (referenced inline in §27). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cameleer
Observability platform for Apache Camel applications. Two integration modes: a Java agent (-javaagent) for zero-code instrumentation, or a Quarkus extension for CDI-based instrumentation with GraalVM native image support.
Architecture
cameleer-common Shared models + graph API
|
cameleer-core Observability logic (collector, notifier, exporter, metrics, diagrams)
/ \
/ \
cameleer-agent cameleer-extension (runtime + deployment)
(ByteBuddy instrumentation) (CDI lifecycle hooks, GraalVM native support)
| |
|--- attaches to -------+ |--- compiled into ------+
| | | |
sample-app backend-app caller-app quarkus-app quarkus-native-app
(Spring Boot) (Quarkus) (Quarkus, no agent)
Quick Start
Build
mvn clean package -DskipTests
Option 1: Java Agent (any Camel app)
Attach the shaded agent JAR to any Camel application — Spring Boot, Quarkus (JVM mode), or standalone:
java -javaagent:cameleer-agent/target/cameleer-agent-1.0-SNAPSHOT-shaded.jar \
-jar your-camel-app.jar
Option 2: Quarkus Extension (Quarkus apps, including native)
Add the extension dependency to your Quarkus project:
<dependency>
<groupId>com.cameleer</groupId>
<artifactId>cameleer-extension</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
Configure in application.properties:
cameleer.agent.export.type=HTTP
cameleer.agent.export.endpoint=http://cameleer-server:8081
cameleer.agent.application=my-app
No -javaagent flag needed. Works in JVM and GraalVM native mode.
Run Example Apps
# Spring Boot sample app (agent mode)
java -javaagent:cameleer-agent/target/cameleer-agent-1.0-SNAPSHOT-shaded.jar \
-jar cameleer-sample-app/target/cameleer-sample-app-1.0-SNAPSHOT.jar
# Quarkus sample app (agent mode, uber-jar)
java -javaagent:cameleer-agent/target/cameleer-agent-1.0-SNAPSHOT-shaded.jar \
-jar cameleer-quarkus-app/target/cameleer-quarkus-app-1.0-SNAPSHOT-runner.jar
# Quarkus native app (extension mode, no agent, uber-jar)
java -jar cameleer-quarkus-native-app/target/cameleer-quarkus-native-app-1.0-SNAPSHOT-runner.jar
Test REST Endpoint
curl -X POST http://localhost:8080/api/orders \
-H "Content-Type: application/json" \
-d '{"orderId":"123","type":"PRIORITY","amount":99.99}'
What You Get
- Route monitoring — execution chunks for every route execution with timing, status, correlation
- Processor tracing — flat processor records with
seq/parentSeqparent-child relationships - Payload capture — exchange-level input/output snapshots (REGULAR+) and per-processor body/headers/properties (COMPLETE)
- Error tracking — classified errors (TIMEOUT/CONNECTION/VALIDATION/SECURITY/RESOURCE) with full stack traces
- Metrics bridge — Camel JMX statistics in periodic summaries (JVM mode only)
- Prometheus endpoint —
/metricsHTTP endpoint for scraping - Route graphs — JSON graph models of every route's topology (nodes, edges, EIP patterns)
- Cross-service correlation —
X-Cameleer-CorrelationIdheader propagation across services - Taps — runtime business attribute extraction via Camel expression languages
- Replay — synchronous exchange replay with audit trail
- Route control — dynamic start/stop/suspend/resume of routes
- Route state reporting — real-time route state (Started/Stopped/Suspended) via heartbeat and state change events
- Log forwarding — Logback, Log4j2, and JUL log forwarding to the server
- OpenTelemetry — hybrid OTel integration (OFF/AUTO/CREATE/CORRELATE modes)
- Auto-recovery — re-registers with full capabilities on 404 (server data loss), refreshes JWT on 401/403
Configuration
System properties with cameleer.agent. prefix (agent mode) or application.properties entries (extension mode):
| Property | Default | Description |
|---|---|---|
cameleer.agent.enabled |
true |
Master on/off |
cameleer.agent.export.type |
LOG |
LOG or HTTP |
cameleer.agent.export.endpoint |
Server URL (for HTTP export) | |
cameleer.agent.application |
default |
Application identifier |
cameleer.agent.environment |
default |
Environment identifier (dev/staging/prod) |
cameleer.agent.instanceid |
Optional instance ID override (default: {hostname}-{pid}) |
|
cameleer.agent.engine.level |
REGULAR |
NONE, MINIMAL, REGULAR, COMPLETE |
cameleer.agent.payload.capture |
BOTH |
NONE, INPUT, OUTPUT, BOTH |
cameleer.agent.payload.maxsize |
4096 |
Max payload bytes |
cameleer.agent.payload.sensitiveheaders |
Authorization,Cookie,Set-Cookie,X-API-Key,X-Auth-Token,Proxy-Authorization |
Headers to mask |
cameleer.agent.payload.sensitiveproperties |
(empty) | Exchange properties to mask |
cameleer.agent.metrics.enabled |
true |
Bridge Camel JMX metrics |
cameleer.agent.metrics.interval |
60 |
Metrics summary interval (seconds) |
cameleer.agent.prometheus.enabled |
false |
Prometheus /metrics endpoint |
cameleer.agent.prometheus.port |
9464 |
Prometheus endpoint port |
cameleer.agent.diagram.enabled |
true |
Extract route graph models |
cameleer.agent.diagram.outputdir |
./cameleer-diagrams |
Graph JSON output directory |
cameleer.agent.diagram.debugsvg |
false |
Generate debug SVG files |
cameleer.agent.sampling.rate |
1.0 |
Global sampling rate (0.0-1.0) |
cameleer.agent.routecontrol.enabled |
false |
Enable dynamic route control |
cameleer.agent.replay.enabled |
false |
Enable exchange replay |
cameleer.agent.taps.enabled |
true |
Enable business attribute extraction |
cameleer.agent.logs.enabled |
true |
Enable log forwarding |
cameleer.agent.otel.mode |
OFF |
OpenTelemetry mode: OFF, AUTO, CREATE, CORRELATE |
cameleer.agent.execution.compresssuccess |
false |
Strip processor records from successful executions |
cameleer.agent.health.enabled |
true |
Enable health endpoint |
Example with custom config:
java -Dcameleer.agent.payload.capture=INPUT \
-Dcameleer.agent.export.type=HTTP \
-Dcameleer.agent.export.endpoint=http://localhost:8081 \
-Dcameleer.agent.prometheus.enabled=true \
-javaagent:cameleer-agent/target/cameleer-agent-1.0-SNAPSHOT-shaded.jar \
-jar cameleer-sample-app/target/cameleer-sample-app-1.0-SNAPSHOT.jar
Modules
cameleer/
├── cameleer-common/ Shared models + graph API
├── cameleer-core/ Observability logic (no ByteBuddy) + PostStartSetup
│ ├── collector/ Execution collection + payload capture
│ ├── notifier/ EventNotifier + InterceptStrategy
│ ├── export/ Log + HTTP (chunked) exporters
│ ├── connection/ Server connection, SSE, heartbeat
│ ├── command/ SSE command handling
│ ├── config/ Config cache management
│ ├── diagram/ Route model extraction + debug SVG
│ ├── metrics/ Camel JMX metrics + Prometheus
│ ├── tap/ Business attribute extraction
│ ├── otel/ OpenTelemetry bridge
│ ├── health/ Health endpoint + startup report
│ └── logging/ Log forwarding (Logback, Log4j2, JUL)
├── cameleer-agent/ Java agent (ByteBuddy instrumentation)
│ ├── instrumentation/ ByteBuddy advice + transformer
│ └── logging/ ByteBuddy-injected log appenders
├── cameleer-extension/ Quarkus extension
│ ├── runtime/ CDI lifecycle hooks → core
│ └── deployment/ Build-time processing (reflection registration)
├── cameleer-sample-app/ Spring Boot + Camel (11 route classes)
├── cameleer-backend-app/ REST product service (cross-service demo)
├── cameleer-caller-app/ HTTP caller (cross-service correlation demo)
├── cameleer-quarkus-app/ Quarkus + Camel Quarkus (5 route classes)
├── cameleer-quarkus-native-app/ Quarkus with extension (GraalVM-ready)
└── docs/ Architecture + design documentation
Requirements
- Java 17+
- Maven 3.9+
- Apache Camel 4.10.x (target application)
- Quarkus 3.33+ (for extension mode, Camel Quarkus 3.11 minimum)
Description