用Opentelemetry和Uptrace监视烧瓶
#编程 #python #devops #monitoring

仍在使用Jaeger/Sentry? UpTrace是一种开源APM工具,可支持分布式跟踪,指标和日志。您可以使用它来监视应用程序并设置自动警报以通过电子邮件,松弛,电报等接收通知。

Uptrace distributed tracing tool


什么是跟踪?

Distributed Tracing允许您通过多个服务和组件遵循请求,捕获每个操作的时间以及发生的任何日志和错误。

在分布式环境中,追踪进一步增强了您对分布式微服务与系统之间的关系和相互作用的理解。

Distributed tracing

跟踪使您可以将请求分解为跨度。 span 是您的应用程序在处理请求时执行的操作(工作单位),例如数据库查询或网络调用。

a 跟踪是一棵跨度,它显示了请求通过应用程序所采取的路径。根跨度是跟踪中的第一个跨度。

Spans and trace

什么是opentelemetry?

OpenTelemetryOpenTelemetry tracing(包括日志和错误)和OpenTelemetry metrics的开源可观察性框架。

OpentElemetry允许开发人员可以自动生成遥测数据,然后可以收集和分析这些数据,以深入了解系统的性能,行为和健康。它支持多种编程语言,并与多个可观察性工具和平台集成。

Otel允许开发人员以供应商不可知论的方式收集和导出遥测数据。使用OpenTelemetry,您可以启动一次应用程序,然后添加或更改供应商而无需更改仪器,以下是支持OpenTelemetry的DataDog competitors列表。

创建跨度

要测量数据库查询或HTTP请求的性能,您可以使用OpenTelemetry Python API创建一个跨度:

from opentelemetry import trace

tracer = trace.get_tracer("app_or_package_name", "1.0.0")

def some_func(**kwargs):
    with tracer.start_as_current_span("some-func") as span:
        // the code you are measuring

要记录上下文信息,您可以用attributes注释跨度。例如,HTTP端点可能具有http.method = GEThttp.route = /projects/:id的属性。

# To avoid expensive computations, check that span is recording
# before setting any attributes.
if span.is_recording():
    span.set_attribute("http.method", "GET")
    span.set_attribute("http.route", "/projects/:id")

您还可以记录异常并设置跨度状态代码以指示错误:

except ValueError as exc:
    # Record the exception and update the span status.
    span.record_exception(exc)
    span.set_status(trace.Status(trace.StatusCode.ERROR, str(exc)))

有关详细信息,请参见OpenTelemetry Python tracing

什么是上游?

OpentElemetry依靠后端系统来存储,处理,分析和可视化从应用程序收集的遥测数据。作为关键组成部分,后端使您能够根据收集的遥测数据提取有价值的见解并做出明智的决定。

UpTrace是一种用于OpentElemetry的open source APM,具有直观的查询构建器,丰富的仪表板,自动警报和大多数语言和框架的集成。

您可以通过下载deb/rpm软件包或预编译的GO二进制get started

示例应用程序

在本教程中,您将仪器使用使用烧瓶和SQLalchemy数据库客户端的toy app。您可以使用以下命令检索源代码:

git clone git@github.com:uptrace/uptrace.git
cd example/flask

该应用程序带有一些可以安装的依赖项:

pip install -r requirements.txt

配置OpentElemetry

UpTrace提供为您配置OpenTelemetry SDK的OpenTelemetry Python发行版。安装发行版:

pip install uptrace
然后

# manage.py

import uptrace

def main():
    uptrace.configure_opentelemetry(
        # Copy DSN here or use UPTRACE_DSN env var.
        # dsn="",
        service_name="myservice",
        service_version="v1.0.0",
    )

    # other code

仪器烧瓶应用程序

要进行仪表瓶应用程序,您需要安装相应的
OpenTelemetry Flask仪器:

pip install opentelemetry-instrumentation-flask

然后您可以仪器烧瓶应用程序:

from opentelemetry.instrumentation.flask import FlaskInstrumentor

app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)

仪器sqlalchemy

要仪器sqlalchemy数据库客户端,您需要安装相应的OpenTelemetry SQLAlchemy

pip install opentelemetry-instrumentation-sqlalchemy

然后仪器DB发动机:

from flask_sqlalchemy import SQLAlchemy
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor

app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///:memory:"
db = SQLAlchemy(app)
SQLAlchemyInstrumentor().instrument(engine=db.engine)

运行示例

您可以使用
的单个命令启动上将后端 Docker example

docker-compose up -d

,然后启动app将Uptrace DSN作为ENV变量传递:

export UPTRACE_DSN=http://project2_secret_token@localhost:14317/2
python3 main.py

该应用程序应在http://localhost:8000上提供请求,并应呈现指向UpTrace UI的链接。打开链接后,您应该看到以下内容:

OpenTelemetry Flask trace

下一步是什么?

接下来,仪器更多的操作以获取更详细的图片。尝试优先考虑网络调用,磁盘操作,数据库查询,错误和日志。

您还可以使用
创建自己的乐器 OpenTelemetry Python Tracing API.