elastic / elastic/apm-agent-python

Accessing APM with FastAPI

オープン
#1,672 コメント 1 件 リアクション 1 件 担当者 0 名 GitHub で見る
agent-python community triage
主要言語
Python
スター
431
フォーク
239
平均マージ
5日 10時間
マージ済み PR(30日)
7

説明

I'm running an API using FastAPI and trying to connect do elastic APM and give the following error:

```
No custom SERVICE_NAME was set -- using non-descript default 'unknown-python-service'
Could not register elasticapm.metrics.sets.cpu.CPUMetricSet metricset: psutil not found. Install it to get system and process metrics
No custom SERVICE_NAME was set -- using non-descript default 'unknown-python-service'
Could not register elasticapm.metrics.sets.cpu.CPUMetricSet metricset: psutil not found. Install it to get system and process metrics
Client object is being set more than once
Stack (most recent call last):
File "C:\Users\DOMINGRC\Factories\API_IRN\app\main.py", line 68, in
uvicorn.run(app='main:app', host="0.0.0.0", port=8000, root_path="/")
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\main.py", line 447, in run
server.run()
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\server.py", line 68, in run
return asyncio.run(self.serve(sockets=sockets))
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\asyncio\runners.py", line 44, in run
return loop.run_until_complete(main)
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 629, in run_until_complete
self.run_forever()
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 596, in run_forever
self._run_once()
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 1890, in _run_once
handle._run()
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\asyncio\events.py", line 80, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\server.py", line 76, in serve
config.load()
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\config.py", line 448, in load
self.loaded_app = import_from_string(self.app)
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1030, in _gcd_import
File "", line 1007, in _find_and_load
File "", line 986, in _find_and_load_unlocked
File "", line 680, in _load_unlocked
File "", line 850, in exec_module
File "", line 228, in _call_with_frames_removed
File "C:\Users\DOMINGRC\Factories\API_IRN\app\main.py", line 13, in
apm = make_apm_client()
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\site-packages\elasticapm\contrib\starlette\__init__.py", line 71, in make_apm_client
return client_cls(config, **defaults)
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\site-packages\elasticapm\base.py", line 224, in __init__
set_client(self)
File "C:\Users\DOMINGRC\AppData\Local\Programs\Python\Python39\lib\site-packages\elasticapm\base.py", line 703, in set_client
logger.warning("Client object is being set more than once", stack_info=True)
```

My code is:
```python
import uvicorn
from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi
from elasticapm.contrib.starlette import make_apm_client, ElasticAPM

app = FastAPI()
apm = make_apm_client({"SERVICE_NAME": 'API_IRN',
"SECRET_TOKEN": "secret",
"SERVER_URL": "127.0.0.1:8200",
"ELASTIC_APM_ENVIRONMENT": "DEV",
"VERIFY_SERVER_CERT": False})
app.add_middleware(ElasticAPM, client=apm)

@app.get("/health")
async def health():
return {"message": "IRN API is up and running..."}

def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = get_openapi(
title="API_IRN",
version="1.0.0",
description="API extrair dados do IRN",
routes=app.routes,
)
openapi_schema["paths"]["/api/auth"] = {
"post": {
"requestBody": {"content": {"application/json": {}}, "required": True}, "tags": ["Auth"]
}
}
app.openapi_schema = openapi_schema
return app.openapi_schema

app.openapi = custom_openapi()

if __name__ == '__main__':
try:
uvicorn.run(app='main:app', host="0.0.0.0", port=8000, root_path="/")
except Exception as ex:
print("ERROR-main" + ex.message)
```

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

app/main.py の起動時の動作を再現し、make_apm_client、ElasticAPM ミドルウェア、およびレポートに示されている uvicorn.run エントリポイントに焦点を当てます。報告された警告を FastAPI の統合動作と比較し、原因が設定にあるのか、ミドルウェアの構成にあるのかを特定します。完了の条件は、診断が確認され、解決策が明確に文書化されていることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
fastapi, python
領域
api, backend, observability
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
25/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。