# fastapi
https://signoz.io/blog/opentelemetry-fastapi/
# OpenTelemetry
*opentelemetry.io*
>High-quality, ubiquitous, and portable telemetry to enable effective observability
# Tempo
>Tempo is the tracing puzzle of the Grafana observability portfolio.
Ref: [Trace — Log Correlation with Grafana Tempo](https://blog.devgenius.io/trace-log-correlation-with-grafana-tempo-311d499ce63a)

# Concept
[Youtube:初探 OpenTelemetry 工具組:蒐集遙測數據的新標準](https://youtu.be/PT-Bjs6iCug?si=BuRkMRbe5vxW45sg)
# Note of Video
>初探 OpenTelemetry 工具組:蒐集遙測數據的新標準

(1)[video: Signoz Service Map](https://youtu.be/PT-Bjs6iCug?si=wRM3lUum5O_OcXjs&t=3772)

(2)[video: Metrics](https://youtu.be/PT-Bjs6iCug?si=pE72mn8a8eXDj1j5&t=3782)

(3)[video: Traces](https://youtu.be/PT-Bjs6iCug?si=nVmnbnedS-c7k4R_&t=3804)
**Drill Down**
(3-1)
點入其中一個Trace ID

(3-2)
點入其中一個Span ID

[detail of sql query](https://youtu.be/PT-Bjs6iCug?si=Vko-x_GIjKeDAd-y&t=3845)
# Steps
(1) 確認Local可生成監控數據(trace/log/metrics)
(2) k8s Application deploy setting
(3) Grafana or others(ex:[SigNoz](https://signoz.io/)) 呈現 use tempo (datasource)
---
# Relations
```Example Application (OpenTelemetry Agent) <- (OTLP/gRPC)- OpenTelemetry Collector <- Tempo <- (Grafana|Others)```
# Python
- `opentelemetry-instrument` is OpenTelemetry Agent
- OTLP is **exporter**
- OpenTelemetry Collector(port:4317)
---
:::danger
*(需重寫以下...for Python解說)*
需新增: dockerfile adjustment, Basic(不改動source code) vs Advanced(動source code)
:::
**OpenTelemetry(OTel)** with Python
[官網參考_Python Application adopt OpenTelemetry](https://opentelemetry.io/docs/languages/python/getting-started/)
## (1) Basic - Run the instrumented app
- Automatic instrumentation
>Automatic instrumentation captures telemetry at the edges of your systems, such as inbound and outbound HTTP requests.
- opentelemetry-distro **package**
>Install the opentelemetry-distro package, which contains the OpenTelemetry API, SDK and also the tools opentelemetry-bootstrap and opentelemetry-instrument...
## (2) Advanced - Modify Code for manual instrumentation to know what’s going on in the application
Code Snippet - Traces
:::spoiler
```python3=
from random import randint
from flask import Flask
from opentelemetry import trace
# Acquire a tracer
tracer = trace.get_tracer("diceroller.tracer")
app = Flask(__name__)
@app.route("/rolldice")
def roll_dice():
return str(roll())
def roll():
# This creates a new span that's the child of the current one
with tracer.start_as_current_span("roll") as rollspan:
res = randint(1, 6)
rollspan.set_attribute("roll.value", res)
return res
```
:::
Code Snippet - Metrics
:::spoiler
```python3=
# These are the necessary import declarations
from opentelemetry import trace
from opentelemetry import metrics
from random import randint
from flask import Flask, request
import logging
# Acquire a tracer
tracer = trace.get_tracer("diceroller.tracer")
# Acquire a meter.
meter = metrics.get_meter("diceroller.meter")
# Now create a counter instrument to make measurements with
roll_counter = meter.create_counter(
"dice.rolls",
description="The number of rolls by roll value",
)
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@app.route("/rolldice")
def roll_dice():
# This creates a new span that's the child of the current one
with tracer.start_as_current_span("roll") as roll_span:
player = request.args.get('player', default = None, type = str)
result = str(roll())
roll_span.set_attribute("roll.value", result)
# This adds 1 to the counter for the given roll value
roll_counter.add(1, {"roll.value": result})
if player:
logger.warn("{} is rolling the dice: {}", player, result)
else:
logger.warn("Anonymous player is rolling the dice: %s", result)
return result
def roll():
return randint(1, 6)
```
:::
---
# Kubernetes (k8s)
:::success
For Deploy to Kubernetes
:::
[在不改動 source code 的情況下,將 Opentelemetry 的 Python auto-instrumentation 加入,導入 trace/log/metrics 監控數據生成](https://sean22492249.medium.com/%E5%9C%A8%E4%B8%8D%E6%94%B9%E5%8B%95-source-code-%E7%9A%84%E6%83%85%E6%B3%81%E4%B8%8B-%E5%B0%87-opentelemetry-%E7%9A%84-python-auto-instrumentation-%E5%8A%A0%E5%85%A5-%E5%B0%8E%E5%85%A5-trace-log-metrics-%E7%9B%A3%E6%8E%A7%E6%95%B8%E6%93%9A%E7%94%9F%E6%88%90-4da76e97862b)