Multi-module examples for otel-util-genai manual instrumentation (OTel GenAI Semantic Conventions v1.41.1).
| Module | Description | Port |
|---|---|---|
| example-common | Shared OTel/GenAI config and voice telemetry helpers | — |
| basic-example | REST API covering all well-known gen_ai.operation.name values |
8080 |
| asr-example | WebSocket ASR → LLM → TTS voice assistant | 8080 |
- Java 17+
- Maven 3.8+
- DashScope API Key (China North 2 / Beijing): Get API Key
Edit placeholders in each module's src/main/resources/application.yml (<your-dashscope-api-key>, <your-license-key>, <your-workspace-id>, etc.). Do not commit real API keys.
| Property / env | Default | Description |
|---|---|---|
genai.api-key |
<your-dashscope-api-key> |
DashScope API Key |
genai.base-url |
https://dashscope.aliyuncs.com/compatible-mode/v1 |
Beijing OpenAI-compatible endpoint |
genai.model |
qwen-plus |
LLM Chat |
dashscope.asr.model |
fun-asr-realtime |
Real-time ASR |
dashscope.tts.model |
cosyvoice-v3-plus |
Real-time TTS |
dashscope.tts.voice |
longanyang |
v3 system voice |
# From repo root
mvn install -DskipTests
mvn -pl examples/example-common,examples/basic-example,examples/asr-example -am compileDemonstrates chat, embeddings, execute_tool, invoke_agent, invoke_workflow, retrieval, create_agent.
# Edit genai.api-key and CMS placeholders in src/main/resources/application.yml
cd examples/basic-example
mvn spring-boot:runcurl -X POST http://localhost:8080/api/chat \
-H "Content-Type: application/json" \
-d '{"message": "What is OpenTelemetry?"}'See basic-example/README.md for all endpoints.
End-to-end voice turn with GenAI semconv:
websocket.session
└─ invoke_workflow voice_assistant_turn
├─ generate_content fun-asr-realtime # ASR (InferenceInvocation)
├─ chat qwen-plus # intent + reply
├─ execute_tool get_weather # weather intent only
└─ generate_content cosyvoice-v3-plus # TTS + gen_ai.output.type=speech
# Edit genai.api-key and CMS placeholders in src/main/resources/application.yml
cd examples/asr-example && mvn spring-boot:runFor WebSocket protocol, test client, and sample utterances, see asr-example/README.md.
# In another terminal: send 16 kHz mono WAV
pip install websocket-client
python examples/asr-example/scripts/ws_voice_client.py your-16k-mono.wavConnect: ws://localhost:8080/ws/asr → binary PCM → text END → receive JSON + MP3.
application.yml keeps full OTLP defaults with placeholders. Replace them with your CMS values in the CMS console.
examples/
├── pom.xml # aggregator
├── example-common/ # GenAiConfig, GenAiOperations, VoiceSessionTelemetry, ...
├── basic-example/ # REST Spring Boot app
└── asr-example/ # WebSocket voice Spring Boot app