FastapI 서비스를 모니터링하는 방법
본 논문에서fastAPI 서비스의 지연과 코드 성능을 어떻게 감시하는지 토론할 것이다.
API 모니터링 및 API 평가
감시는 본질적으로 응용 프로그램의 백엔드에서 데이터를 수집하여 문제 진단, 디버깅 오류 또는 알림 서비스의 지연을 돕는다.
예를 들어, 인프라 수준에서 CPU 및 메모리 활용도를 모니터링할 수 있습니다.예를 들어 응용 프로그램 단계에서 오류, 코드 성능 또는 데이터베이스 조회 성능을 감시할 수 있다.모니터링에 대한 자세한 설명과 필요성은 this excellent post from Full Stack Python을 참조하십시오.
본고에서는FastapI 응용 프로그램의 응용 프로그램 성능 감시(APM)를 중점적으로 소개할 것이다.
오류 추적
본 논문에서, 나는 응용 프로그램의 오류와 경고를 감시하는 것에 대해 토론하지 않을 것이다.이를 위해 Sentry는 ASGI 지원이 우수하고 FastapI 서비스는 will work out of the box을 지원합니다.
API 분석
평가는 웹 개발에 특정하지 않은 코드의 최적 실천이다.python docs on profiling에서 확인할 수 있는 내용은 다음과 같습니다.
the profilers run code and give you a detailed breakdown of execution times, allowing you to identify bottlenecks in your programs. Auditing events provide visibility into runtime behaviors that would otherwise require intrusive debugging or patching.
물론, 평가는 FastapI 응용 프로그램 컨텍스트에 적용할 수 있습니다.이런 상황에서 당신은 this timing middleware이 매우 편리하다는 것을 발견할 수 있습니다.
그러나 이러한 방법을 통해 정시 데이터는 stdout에 기록된다.개발 과정에서 병목을 발견할 수 있지만, 실제로는 생산 중인 로그를 보면서 지연 정보를 얻는 것이 가장 편리하지 않습니다.
애플리케이션 성능 모니터링(APM)에 사용할 수 있는 도구
모든 일과 마찬가지로 선택의 여지가 많다.어떤 것은 개원한 것이고, 어떤 것은 SaaS 업무이다.
아마도 너나 너의 조직은 이미 하나 이상의 모니터링 도구를 사용하고 있을 것이다. 그러므로 나는 네가 알고 있는 것부터 시작할 것을 건의한다.
다음 목록의 도구는 APM에만 사용되는 것이 아니라 이해하기 어려울 때도 있습니다.들어보셨을 수 있는 애플리케이션 모니터링 툴의 예:
New Relic(상업부분 오픈소스)
Datadog(상업부분 오픈소스)
이 목록에서 가장 최근의 것은 현재 응용 프로그램 모니터링 지표의 사실 기준이다.
이 점에서 도구를 선택하는 것은 중요하지 않다. APM 도구의 기능을 더 잘 알 수 있도록 하자.
모니터링 4단계
응용 프로그램 언어에 대응하는 라이브러리로 서비스 제공
(우리의 예는python이다).
monitoring client library
입니다.모니터링 클라이언트 라이브러리 예:
monitoring client library
은 네트워크(특히 UDP, TCP나 HTTP가 아닌)를 통해 monitoring server daemon
에 각각 별도의 호출을 보냅니다.monitoring server daemon
에서 애플리케이션의 모니터링 이벤트를 수신하고 있습니다.그것은 전송된 데이터를 대량으로 포장하여 monitoring backend
에 정기적으로 발송한다.monitoring backend
은 일반적으로 두 부분으로 구성되어 있는데 그것이 바로 데이터 처리 응용 프로그램과 시각화된 네트워크 응용 프로그램이다.그것은 감시 데이터 흐름을 인간이 읽을 수 있는 도표와 경보로 전환시킨다.예를 들면 다음과 같습니다.
ASGI 네트워크 응용프로그램 모니터링 문제
ASGI는python 웹 서버의 비교적 새로운 표준이다.마치... 와 같다
모든 새로운 표준은 모든 도구에 적응하는 데 시간이 필요하다
생태계가 그것을 지원한다.
상기 4가지 모니터링 절차를 감안하면
monitoring client library
은 ASGI를 지원하지 않습니다.예를 들어,뉴사리는 현재 이렇다(더 자세한 내용은 ASGI - Starlette/Fast API Framework · Issue #5 · newrelic/newrelic-python-agent).Datadog도 살펴보았지만 ASGI는 현재 지원되지 않습니다.
그러나 이러한 도구의 개원 방면에서 OpenTelemetry는 이미 성공했다
ASGI는 매우 지원됩니다.그래서 제 FastapI를 설치하기 시작했어요.
OpenTelemetry를 사용하여 서비스를 제공합니다.
업데이트 날짜: 2020년 9월 19일:
There seems to be support for ASGI in ddtrace
업데이트 날짜: 2020년 9월 22일:
There is now an API in the NewRelic agent to support ASGI frameworks, uvicorn이 지원을 받았고 starlette가 곧 출시됩니다.
업데이트 날짜: 2020년 10월 23일:
New Relic python 에이전트는 Starlette 및 Fast API를 즉시 사용할 수 있도록 지원합니다.
OpenTelemetry 및 Jaeger를 사용한 FastapI 테스트
OpenTelemetry는 상기 4단계 중의 1단계(
Instrumentors
)와 2단계(Exporters
)에 표준을 제공했다.그것의 큰 우세는OpenTelemetry는 모든 모니터링 시스템에 이벤트를 전송할 수 있음을 의미합니다.
백엔드.이것은 특히 훌륭합니다. 당신은
development
, staging
, production
환경에서 같은 기기를 사용하여 설치할 수 있기 때문입니다.마이크로 서비스가 사용하는 언어에 따라 당신의 노정이 다를 수 있음을 주의하십시오.예를 들어,
파이썬에는 New Relic OpenTelemetry Exporter가 없습니다.
그러나 다른 OpenTelemetry 내보내기도 많이 있습니다. 아래 목록을 참고하십시오: Registry | OpenTelemetry (언어별로 필터, 유형 = 내보내기).
사용 가능한 백엔드 중 하나는 Jaeger: open source, end-to-end distributed tracing입니다.(Jaeger도 모니터링 클라이언트 라이브러리입니다.
응용 프로그램에 명령을 삽입하지만, 이것은 중점이 아니다
흥미가 있었어
비록 이것은 기원된 것이고, 일하기는 매우 간단하지만, 나와 Jaeger의 문제는 아직 데이터 파이프가 없다는 것이다.
이것은 Visualization 웹 앱에서 추적을 탐색할 수 있음을 의미합니다
너는 어떤 종합 도표도 볼 수 없다.그러나 이러한 백엔드는 on their roadmap입니다.
그럼에도 불구하고 Jaeger는 제가
development
에서 모니터링을 하는 goto 도구입니다.상세한 것은 마지막 부분을 보십시오.OpenTelemetry 및 Datadog을 사용한 FastAPI 테스트
데이터 파이프를 갖춘 소스 모니터링 백엔드를 찾을 수 없습니다. 제가 원하는 기능을 제공할 수 있습니다.
(지연 백분율 그림, 총 요청과 오류의 줄무늬 그림...)
이것이 바로 닮았다는 것이 분명하다
New Relic과 Datadog이 번쩍입니다.그래서 OpenTeletry Datadog exporter를 시도하기 시작했습니다.
이러한 방법을 통해 당신은 기능이 완비된 모니터링 백엔드를 얻을 수 있다
이것은 너로 하여금 너의 미세한 서비스에 대해 충분한 관찰 능력을 가지게 할 것이다.
이러한 두 가지 단점은 다음과 같습니다.
Datadog의 가격은 특히 Datadog을 구축할 때 주의해야 합니다.
쿠베르네트스의 스파이😈).
OpenTelementry, Jaeger 및 DataDog을 사용한 FastaPI 도구 예
그럼 코드에서 어떤 모양인가요?
이것이 바로 나의 응용 프로그램 공장의 모습이다.문의 사항이 있으면 언제든지 github issue에 문의하거나 문의하십시오.
나는 내 명령 삽입을 공유하지 않을 것이다. 왜냐하면 이것은 내 프로그램과 특정한 것이기 때문이다. 그러나 상상해 보아라. 당신은 모든 끼워 넣은 거리를 정의할 수 있고, 이러한 추적은 같은 방식으로 Jaeger나 DataDog에 전송될 것이다.이로써 교체 플러그인 코드(예를 들어 간격을 추가하거나 삭제하는 것)가 매우 빠르고 코드의 성능 병목을 더욱 빨리 발견할 수 있다.
"""FastAPI Application factory with OpenTelemetry instrumentation
sent to Jaeger in dev and to DataDog in staging and production."""
from fastapi import FastAPI
from opentelemetry import trace
from opentelemetry.exporter.datadog import DatadogExportSpanProcessor, DatadogSpanExporter
from opentelemetry.exporter.jaeger import JaegerSpanExporter
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchExportSpanProcessor
from my_api.config import generate_settings
from my_api.routers import my_router_a, my_router_b
def get_application() -> FastAPI:
"""Application factory.
Returns:
ASGI application to be passed to ASGI server like uvicorn or hypercorn.
Reference:
- [FastAPI Middlewares](https://fastapi.tiangolo.com/advanced/middleware/)
"""
# load application settings
settings = generate_settings()
if settings.environment != "development":
# opentelemetry + datadog for staging or production
trace.set_tracer_provider(TracerProvider())
datadog_exporter = DatadogSpanExporter(
agent_url=settings.dd_trace_agent_url,
service=settings.dd_service,
env=settings.environment,
version=settings.dd_version,
tags=settings.dd_tags,
)
trace.get_tracer_provider().add_span_processor(
DatadogExportSpanProcessor(datadog_exporter)
)
else:
# opentelemetry + jaeger for development
# requires jaeger running in a container
trace.set_tracer_provider(TracerProvider())
jaeger_exporter = JaegerSpanExporter(
service_name="my-app", agent_host_name="localhost", agent_port=6831,
)
trace.get_tracer_provider().add_span_processor(
BatchExportSpanProcessor(jaeger_exporter, max_export_batch_size=10)
)
application = FastAPI(
title="My API",
version="1.0",
description="Do something awesome, while being monitored.",
)
# Add your routers
application.include_router(my_router_a)
application.include_router(my_router_b)
FastAPIInstrumentor.instrument_app(application)
return application
app = get_application()
결론
나는 이 문장을 통해 네가 배울 수 있기를 바란다.
OneFootball에 다국어 NLP fastapi 서비스를 만들었습니다. 이 설정으로 속도를 10배 높였습니다.
리소스
Reference
이 문제에 관하여(FastapI 서비스를 모니터링하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/louisguitton/how-to-monitor-your-fastapi-service-3mpo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)