Turn OpenTelemetry traces into a live typed entity graph, with a zero-change servicegraph path and opt-in discovery for non-interacting executions.
Semconv Graph is the working product name for this repository. The published
Python SDK keeps the name extended-opentelemetry-semconv; no package or import
names are being renamed.
Most entity graph systems begin after a producer already emits inventory or entity events. Semconv Graph starts with telemetry many teams already have. It uses the OpenTelemetry Collector's service-graph metrics, a generated semantic registry, and stateful lifecycle processing to infer typed nodes and edges.
Existing OTLP traces
-> trace-affine OpenTelemetry Collectors
-> positive service-graph evidence
-> Kafka OTLP Protobuf
-> Flink contributor and lifecycle state
-> graph-element upsert/delete events
-> ArangoDB current-state graph
-> read-only GraphBinary Gremlin
- Automatic extraction from existing service-graph telemetry; applications do not need to emit a new signal.
- Registry-generated Pydantic entity and relationship models.
- Organization-specific entity extensions and Collector dimensions.
- Optional ETL and transaction discovery from completed non-client/non-server root spans through spanmetrics carrying the generated model fields.
- Contributor-aware attribute merging and expiry in Flink.
- Equal lifecycle treatment for semantic nodes and edges.
- Deterministic, compactable Kafka upsert/delete events.
- Idempotent projection into ArangoDB and typed read-only Gremlin access.
- Helm deployments built from standard Kubernetes resources without CRDs.
Root-span discovery is available as an opt-in input. It filters for completed roots whose kind is neither client nor server, aggregates them with the Collector spanmetrics connector, and sends observation evidence rather than raw spans. Registry rules expand each observation into complete entities and relationships, including service -[executes]→ transaction. Both evidence lanes converge on one Java lifecycle engine. Numeric request counts and entity-event logs are intentionally outside the focused graph pipeline.
| Source | Role | Status |
|---|---|---|
Existing traces through the Collector servicegraph connector |
Bootstrap nodes and relationships without application changes | Implemented |
| Aggregated root spans | Discover execution nodes absent from service interactions | Implemented, opt-in |
The repository includes a persistent local demo that starts Redpanda, ArangoDB,
the Kafka indexer, and Gremlin Server, then seeds representative schema-3 graph
events for typed traversal. It also includes an opt-in Kind fixture that verifies
projection, deletion, restart persistence, and spanmetrics root discovery
through the complete Collector-to-Gremlin path.
Docker, Kind, kubectl, Helm 3, and Python 3.12 are required.
python -m pip install -e ".[dev]"
python -m pip install -e "packages/extended-opentelemetry-semconv[gremlin]"
python -m pip install -e services/servicegraph-indexer
python -m tools.local_demo up
python -m tools.local_demo status
python -m tools.local_demo queryProvisioning can take longer than five minutes on a cold Docker cache. The demo
persists until python -m tools.local_demo down. See the
local demo guide for requirements and
the exact follow-up commands.
The focused E2E proves the Kafka lifecycle contract through ArangoDB and typed Gremlin, plus the spanmetrics discovery path from Collector through Flink. Unit tests cover semantic generation, service-graph ingestion, contributor lifecycle behavior, Flink wiring, and indexer decisions. Helm and MkDocs have deterministic validation commands.
The repository does not currently provide:
- an automated paired-servicegraph Collector-to-Flink Kind test;
- distributed throughput, state-size, or infrastructure-cost benchmarks;
- historical or bi-temporal graph queries;
- standard OTel output events;
- implicit deletion of incoming relationships when a target entity is deleted;
- arbitrary OTel identity shapes beyond the exact generated local semantic identity;
- a safe public query API (Gremlin is a trusted internal interface);
- production Kafka or ArangoDB operations.
See Product direction before evaluating production fit.
| Path | Responsibility |
|---|---|
packages/extended-opentelemetry-semconv |
Generated semantic SDK and optional typed Gremlin client |
tools/semconv_codegen |
Registry validation and deterministic generation |
services/otel-servicegraph-diff |
Native Java Flink ingestion/lifecycle engine |
services/servicegraph-indexer |
ArangoDB initializer and Kafka projection |
services/servicegraph-gremlin |
Pinned read-only TinkerPop/ArangoDB runtime |
services/servicegraph-demo |
Optional synthetic OTLP traffic |
examples/auto-instrumentation |
Plain endpoint extraction and explicit ETL context examples |
deploy/helm |
Collector, Flink, demo, ArangoDB, indexer, and Gremlin charts |
Kafka, topic creation, and production ArangoDB remain platform concerns.
- Product direction
- Local demo
- Auto-instrumented endpoint
- Runtime architecture
- Community and launch guide
- Custom entity tutorial
- Kubernetes deployment
Serve the documentation locally:
python -m pip install -e ".[docs]"
python -m mkdocs serveLicensed under the Apache License 2.0.
python -m tools.semconv_codegen --check
python -m mkdocs build --strict
python -m ruff check .
python -m pyright
python -m pytest -m "not e2e"
helm lint deploy/helm/servicegraph-collector
helm lint deploy/helm/servicegraph-demo
helm lint deploy/helm/servicegraph-flink
helm lint deploy/helm/servicegraph-arangodb
helm lint deploy/helm/servicegraph-indexer
helm lint deploy/helm/servicegraph-gremlin