Notes
μ΄λ² λ¦΄λ¦¬μ€ μμ΄μ νΈμλ λ€μμ λν μ§μμ΄ μΆκ°λμμ΅λλ€.
- κ°λ₯
- AWS λ² λλ½ μ»¨λ²μ€ μ€νΈλ¦¬λ°
- λ λμ€ λ©μλ
hybrid_searchλ°msetex - LLM μ΄λ²€νΈμ λν LangChain μν ν λΉ
- LLM μμ² μμ μ μΊ‘μ²λ LLM μ΄λ²€νΈ νμμ€ν¬ν
loop_factoryλ°μ, inasyncio.Runner
μ΄λ² 릴리μ€μμλ μΉ μλ²μμ ν€λκ° λ³΄κ³ λμ§ μλ ASGI μΈ‘μ λ° κ³μΈ‘μ λ²κ·Έλ ν΄κ²°λμμ΅λλ€.
easy_install/pip/distribute μ¬μ©νμ¬ μμ΄μ νΈλ₯Ό μ€μΉνμΈμ. νμ΄μ¬ ν¨ν€μ§ μΈλ±μ€λ₯Ό ν΅ν΄ conda μ¬μ©νκ±°λ, Conda-Forge ν¨ν€μ§ μΈλ±μ€λ₯Ό ν΅ν΄ μ μ¬μ©νκ±°λ, λ΄λ λ¦ λ€μ΄λ‘λ μ¬μ΄νΈ μμ μ§μ λ€μ΄λ‘λνμΈμ.
νΉμ§
Strandsμ§μμ μΆκ°ν©λλ€.
- λ¨μΌ λ° λ€μ€ μμ΄μ νΈ(κ΅°μ§, κ·Έλν λ±) μ€μ μμ Strands λꡬ λ° μμ΄μ νΈμ λν μΈ‘μ , 리μμ€ μΆκ°
AWS Bedrock Converse Streamingμ§μμ μΆκ°ν©λλ€.
- Converse API μ€νΈλ¦¬λ°μ λν λͺ¨λν°λ§ μ§μμ μΆκ°ν©λλ€. μ¬κΈ°μλ
converse_stream()μ μ¬μ©νμ¬ boto3 λ° aioboto3 ν΄λΌμ΄μΈνΈλ‘ μνλλ Converse μ±ν μλ£ νΈμΆμ λν μ§μμ΄ ν¬ν¨λ©λλ€.
- Converse API μ€νΈλ¦¬λ°μ λν λͺ¨λν°λ§ μ§μμ μΆκ°ν©λλ€. μ¬κΈ°μλ
λ λμ€ λ©μλ μ§μμ μΆκ°ν©λλ€.
λ€μ λ©μλμ λν μ§μμ μΆκ°νμΈμ.
hybrid_searchmsetex
loop_factoryμ λν μ§μμ μΆκ°ν©λλ€.asyncio.Runner- λμ΄μ€κΈ° 3.11μμλ
asyncio.Runnerν΄λμ€μloop_factoryλͺ¨λμ΄ μΆκ°λμμ΅λλ€.loop_factoryμμλ 루ν μ μ± μ λν λ체 λ°©λ²μ μ 곡ν©λλ€. μ΄μ μμ±λ 루νλ μ μ μ΄λ²€νΈ 루ν μ€μ μ ν΅νλ μ¬μ©μ μ μ λμ보λ 루νλ₯Ό ν΅νλ μκ΄μμ΄ μΉμΈλ©λλ€.
- λμ΄μ€κΈ° 3.11μμλ
LLM μ΄λ²€νΈμμ LangChain μν ν λΉ μΊ‘μ²
- LangChain
LlmChatCompletionMessageμ΄λ²€νΈμλ μ΄μ LangChain μμ ν λΉλ μν μ΄ ν¬ν¨λμ΄ μμ΅λλ€.
- LangChain
LLM μμ² μμ μ LLM μ΄λ²€νΈ νμμ€ν¬νλ₯Ό μΊ‘μ²ν©λλ€.
- μ΄μ μλ LLM μ΄λ²€νΈμ νμμ€ν¬νκ° μ΄λ²€νΈ μμ± μμ μ κΈ°λ‘λμμ΅λλ€. μ΄μ λ LLM μμ² μμ μ λμ± μ ννκ² κΈ°λ‘λ©λλ€.
λ²κ·Έ μμ
ASGI ν€λ μλΉ
ASGIWebTransactionμ΄http.response.startμ΄λ²€νΈμ ν€λλ₯Ό μλΉν λ, νμ©λλ μ λ ₯ μ νμ κ³ λ €νμ§ μκ³ κ·Έλ κ² νμ΅λλ€. ν€λκ° μμ±κΈ°μΈ κ²½μ° μμ±κΈ°λprocess_response()νΈμΆμ μν΄ μλΉλμ΄ μΉ μλ²κ° λ³΄λΌ ν€λκ° λ¨μ§ μμ΅λλ€. μ΄μ μ΄ λ¬Έμ λ ν΄κ²°λμμ΅λλ€.
μ§μ§ μ±λͺ
μ΅μ μμ΄μ νΈ λ²μ μ΄ μΆμλλ©΄ μ¦μ μ λ°μ΄νΈνλ κ²μ΄ μ’μ΅λλ€. μ΅μ λ²μ μΌλ‘ μ κ·Έλ μ΄λν μ μλ κ²½μ°, μμ΄μ νΈλ₯Ό 90μΌ μ΄λ΄ λ²μ μΌλ‘ μ λ°μ΄νΈνμΈμ. μμ΄μ νΈμκ² μ΅μ μ 보λ₯Ό μ 곡νλ λ°©λ²μ λν΄ μμΈν μμ보μΈμ.
μμ΄μ νΈ λ¦΄λ¦¬μ€ λ° μ§μ λ μ§μ λν μ 보λ λ΄λ λ¦ λμ΄ λΉκΈ°λ μμ΄μ νΈ EOL μ μ± μ μ°Έμ‘°νμΈμ.
Notes
μ΄λ² λμ΄ λΉκΈ°λ μμ΄μ νΈ λ¦΄λ¦¬μ€μλ λμ΄λΉκΉ 3.14 μ§μ, μμ± νν° μ€μ μ μν μλ‘μ΄ νκ²½ λ³μ, νλ‘μΈμ λ°μ½λ μ΄ν°μ λΉλκΈ° μμ±κΈ° μ§μ, AWS Bedrock μ μΆκ° λͺ¨λΈ λ° AWS Kinesis μ μλ‘μ΄ λ°©λ²μ΄ μΆκ°λμμ΅λλ€. μ΄ λ¦΄λ¦¬μ€μμλ ConnectionPool μ¬λ¬ λ² λννμ¬ μ¬μ©ν λ RecursionError μ΄ λ°μνλ aiomysql μ λ²κ·Έ, kombu μ νλ‘λμμμ μμ±μ΄ μ λλ‘ μ λ¬λμ§ μλ λ²κ·Έ, νλ² μ€νΈ μ€λ λ λ΄μμ shutdown_agent νΈμΆλ λ λ°μνλ μ€λ₯λ₯Ό μμ ν©λλ€.
easy_install/pip/distribute μ¬μ©νμ¬ μμ΄μ νΈλ₯Ό μ€μΉνμΈμ. νμ΄μ¬ ν¨ν€μ§ μΈλ±μ€λ₯Ό ν΅ν΄ conda μ¬μ©νκ±°λ, Conda-Forge ν¨ν€μ§ μΈλ±μ€λ₯Ό ν΅ν΄ μ μ¬μ©νκ±°λ, λ΄λ λ¦ λ€μ΄λ‘λ μ¬μ΄νΈ μμ μ§μ λ€μ΄λ‘λνμΈμ.
νΉμ§
λμ΄λΉκΉ 3.14 μ§μ μΆκ°
- λμ΄μ€κΈ° 3.14μ λν μ§μμ μΆκ°ν©λλ€.
μμ± νν° μ€μ μ λν νκ²½ λ³μ μΆκ°
λ€μ μ€μ μ μ΄μ νκ²½ λ³μλ₯Ό ν΅ν΄ μ€μ ν μ μλ μ΅μ μ΄ μκ²Όμ΅λλ€.
κ΅¬μ± μ€μ νκ²½ λ³μ attributes.enabledNEW_RELIC_ATTRIBUTES_ENABLEDattributes.excludeNEW_RELIC_ATTRIBUTES_EXCLUDEattributes.includeNEW_RELIC_ATTRIBUTES_INCLUDEbrowser_monitoring.attributes.enabledNEW_RELIC_BROWSER_MONITORING_ATTRIBUTES_ENABLEDbrowser_monitoring.attributes.excludeNEW_RELIC_BROWSER_MONITORING_ATTRIBUTES_EXCLUDEbrowser_monitoring.attributes.includeNEW_RELIC_BROWSER_MONITORING_ATTRIBUTES_INCLUDEerror_collector.attributes.enabledNEW_RELIC_ERROR_COLLECTOR_ATTRIBUTES_ENABLEDerror_collector.attributes.excludeNEW_RELIC_ERROR_COLLECTOR_ATTRIBUTES_EXCLUDEerror_collector.attributes.includeNEW_RELIC_ERROR_COLLECTOR_ATTRIBUTES_INCLUDEspan_events.attributes.enabledNEW_RELIC_SPAN_EVENTS_ATTRIBUTES_ENABLEDspan_events.attributes.excludeNEW_RELIC_SPAN_EVENTS_ATTRIBUTES_EXCLUDEspan_events.attributes.includeNEW_RELIC_SPAN_EVENTS_ATTRIBUTES_INCLUDEtransaction_events.attributes.enabledNEW_RELIC_TRANSACTION_EVENTS_ATTRIBUTES_ENABLEDtransaction_events.attributes.excludeNEW_RELIC_TRANSACTION_EVENTS_ATTRIBUTES_EXCLUDEtransaction_events.attributes.includeNEW_RELIC_TRANSACTION_EVENTS_ATTRIBUTES_INCLUDEtransaction_segments.attributes.enabledNEW_RELIC_TRANSACTION_SEGMENTS_ATTRIBUTES_ENABLEDtransaction_segments.attributes.excludeNEW_RELIC_TRANSACTION_SEGMENTS_ATTRIBUTES_EXCLUDEtransaction_segments.attributes.includeNEW_RELIC_TRANSACTION_SEGMENTS_ATTRIBUTES_INCLUDEtransaction_tracer.attributes.enabledNEW_RELIC_TRANSACTION_TRACER_ATTRIBUTES_ENABLEDtransaction_tracer.attributes.excludeNEW_RELIC_TRANSACTION_TRACER_ATTRIBUTES_EXCLUDEtransaction_tracer.attributes.includeNEW_RELIC_TRANSACTION_TRACER_ATTRIBUTES_INCLUDE
νΈλμμ λ°μ½λ μ΄ν°μ λΉλκΈ° μμ±κΈ° μ§μ μΆκ°
- μ΄μ μλ νΈλμμ λ°μ½λ μ΄ν°κ° λΉλκΈ° μμ±κΈ°λ₯Ό κ°μΈλ κ²μ μ§μνμ§ μμμ΅λλ€. μ΄ μ§μμ΄ μΆκ°λμ΄ μ΄μ λΉλκΈ° μμ±κΈ° νΈλμμ μ΄ μ΄λ²€νΈ 루ν λκΈ° μκ°κ³Ό κΈ°ν ν΅κ³λ₯Ό μλμΌλ‘ μΈ‘μ ν©λλ€.
AWS Bedrock μΈ‘μ , λ‘κ·Έμ μΆκ° λͺ¨λΈμ λν μ§μ μΆκ°
λ€μ μΆκ° λͺ¨λΈμ μ§μνλλ‘ botocore λ° aiobotocore ν΅ν΄ AWS Bedrock μΈ‘μ , κ³μΈ‘μ μ λ°μ΄νΈν©λλ€.
- ν΄λ‘λ μλ€νΈ 3+ λͺ¨λΈ
- μ§μμΌλ‘ μ λμ¬κ° λΆμ λͺ¨λΈ(μ§μ μΈμ)
μλ‘μ΄ Kinesis λ©μλμ λν μΈ‘μ , λ‘κ·Έ μΆκ°
μλ‘μ΄ AWS Kinesis λ©μλλ₯Ό μ§μνκΈ° μν΄ botocore μΈ‘μ , 리μμ€ μΆκ°
describe_account_settingsupdate_account_settingsupdate_max_record_sizeupdate_stream_warm_throughput
λ²κ·Έ μμ
aiomysql ConnectionPoolμμ RecursionError λ°©μ§
- μ΄μ μλ ν μ°κ²°μ μ¬μ©ν λ aiomysql μμ
RecursionErrorμ΄ λ°μνμ΅λλ€. λ°λ³΅μ μΈ λνμΌλ‘ μΈν΄ νλ§λ μ°κ²° μ£Όμμ κΉμObjectProxy체μΈμ΄ μμ±λμμ΅λλ€. μ΄ λ¬Έμ λ ν΄κ²°λμμ΅λλ€.
- μ΄μ μλ ν μ°κ²°μ μ¬μ©ν λ aiomysql μμ
kombu μ νλ‘λμμμ μμ±μ΄ μ λλ‘ μ λ¬λμ§ μλ λ²κ·Έλ₯Ό μμ νμ΅λλ€.
kombu.messaging.Producer.publish()μ λν μΈ‘μ , κ³μΈ‘μΌλ‘ μΈν΄ μμ±μ΄ μ€μλ‘ μ¬μ λ΄λΆμ μ€μ²©λμ΄ μμ±μ΄ μλͺ»λ μμΉμ μκ³ λ€μ΄μ€νΈλ¦Ό ν¨ν€μ§μμ μ½νμ§ μλ λ²κ·Έλ₯Ό μμ νμ΅λλ€.
shutdown_agentμ΄ μν μ€λ λ λ΄μμ νΈμΆλ λ λ°μνλ μ€λ₯λ₯Ό μμ ν©λλ€.- μ΄μ μλ
shutdown_agentμν μ€λ λ λ΄μμ νΈμΆλλ©΄RuntimeErrorμ΄ λ°μν μ μμμ΅λλ€. μ΄λ κ² νλ©΄ μΆ©λμ λ°©μ§νκΈ° μν λ³΄νΈ μ₯μΉκ° μΆκ°λμ΄ λ¬Έμ κ° ν΄κ²°λ©λλ€.
- μ΄μ μλ
μ§μ§ μ±λͺ
μ΅μ μμ΄μ νΈ λ²μ μ΄ μΆμλλ©΄ μ¦μ μ λ°μ΄νΈνλ κ²μ΄ μ’μ΅λλ€. μ΅μ λ²μ μΌλ‘ μ κ·Έλ μ΄λν μ μλ κ²½μ°, μμ΄μ νΈλ₯Ό 90μΌ μ΄λ΄ λ²μ μΌλ‘ μ λ°μ΄νΈνμΈμ. μμ΄μ νΈμκ² μ΅μ μ 보λ₯Ό μ 곡νλ λ°©λ²μ λν΄ μμΈν μμ보μΈμ.
μμ΄μ νΈ λ¦΄λ¦¬μ€ λ° μ§μ λ μ§μ λν μ 보λ λ΄λ λ¦ λμ΄ λΉκΈ°λ μμ΄μ νΈ EOL μ μ± μ μ°Έμ‘°νμΈμ.
Notes
μ΄ λμ΄ λΉκΈ°λ μμ΄μ νΈ λ¦΄λ¦¬μ€λ Django μΈ‘μ μ μ΄κΈ° νμ±ν, μμ€, 무μλλ max_samples_stored μ λν μλ² μΈ‘ μ¬μ μ λ° Python trace_cache.pop() μ μΆ©λ λ°©μ§μ λν μμ μ¬νμ μ 곡ν©λλ€.
λμ΄μ€κΈ° ν¨ν€μ§ μμΈμ ν΅ν΄ easy_install/pip/distribute μ¬μ©νμ¬ μμ΄μ νΈλ₯Ό μ€μΉνκ±°λ λ΄λ λ¦ λ€μ΄λ‘λ μ¬μ΄νΈ μμ μ§μ λ€μ΄λ‘λνμΈμ.
λ²κ·Έ μμ
Django μΈ‘μ , λ‘κ·Έμ μ‘°κΈ° νμ±ν λ°©μ§
- Django μΈ‘μ μμ
application_settings()μ λν νΈμΆμ μ κ±°νμ¬ pre-forkμ μ΄κΈ° νμ±ν κ΄λ ¨ λ¬Έμ λ₯Ό λ°©μ§ν©λλ€.
- Django μΈ‘μ μμ
μλ² μ€μ μ λ‘컬 μ€μ λκΈ°ν λ¬Έμ μμ
- μ΄λ
event_harvest_config.harvest_limits.*μ€μ μ΄*.max_samples_storedμ€μ μΌλ‘ μΈν΄ λ μ΄μ μ¬μ©λμ§ μμ λ λ°μν λ²κ·Έλ₯Ό μμ ν©λλ€. μΌλΆ μλ²μΈ‘ μ€μ μ΄ ν΄λΌμ΄μΈνΈμΈ‘ μ€μ μ μ¬μ μνμ§ μμ μ¬μ©μκ° μ΄λ₯Ό λΉνμ±ννμμλ λΆκ΅¬νκ³ λ°μ΄ν°κ° μμ§κΈ°λ‘ μ μ‘λμμ΅λλ€.
- μ΄λ
μΆ©λλ‘λΆν° 보νΈνμΈμ
trace_cache.pop()ContextOfν΄λμ€μμ κΈ°λ³Έκ° μμ΄pop(key)ν΅ν΄trace_cacheμ μμ νμ§ μμ μ‘μΈμ€κ° λ°μνμ΅λλ€. μ¬μ μweakrefμ΄ μ΄λ―Έ κ°λΉμ§ μμ§λ κ²½μ° μΆ©λμ΄ λ°μνμ΅λλ€.
μ§μ§ μ±λͺ
μ΅μ μμ΄μ νΈ λ²μ μ΄ μΆμλλ©΄ μ¦μ μ λ°μ΄νΈνλ κ²μ΄ μ’μ΅λλ€. μ΅μ λ²μ μΌλ‘ μ κ·Έλ μ΄λν μ μλ κ²½μ°, μμ΄μ νΈλ₯Ό 90μΌ μ΄λ΄ λ²μ μΌλ‘ μ λ°μ΄νΈνμΈμ. μμ΄μ νΈμκ² μ΅μ μ 보λ₯Ό μ 곡νλ λ°©λ²μ λν΄ μμΈν μμ보μΈμ.
μμ΄μ νΈ λ¦΄λ¦¬μ€ λ° μ§μ λ μ§μ λν μ 보λ λ΄λ λ¦ λμ΄ λΉκΈ°λ μμ΄μ νΈ EOL μ μ± μ μ°Έμ‘°νμΈμ.
Notes
μ£Όμ
μ΄ λ²μ μ μμ΄μ νΈλ μ² νλμμ΅λλ€.
μ΄λ² λ¦΄λ¦¬μ€ μμ΄μ νΈμλ λ€μκ³Ό κ°μ λ³κ²½ μ¬νμ΄ μ μ©λ©λλ€.
- λμ΄λΉκΉ 3.7μ λν μ§μ μ κ±°
- λ€μν API λ° μ€μ μ μ κ±°νκ±°λ λ μ΄μ μ¬μ©νμ§ μμ΅λλ€.
- aioredis μΈ‘μ , λ‘κ·Έ μ¬μ© μ€λ¨
setuptoolsμ μ΅μ μ§μ λ²μ μ μ¬λ¦½λλ€.setuptools_scm- AutoGenμ λν μ μΈ‘μ , λ‘κ·Έλ₯Ό μΆκ°ν©λλ€.
- Pyzeebeμ λν μλ‘μ΄ μΈ‘μ , λ‘κ·Έλ₯Ό μΆκ°ν©λλ€.
- μλ‘μ΄ MCP(λͺ¨λΈ 컨ν μ€νΈ νλ‘ν μ½)λΌλ μ΄λ¦μ spanμ μΆκ°ν©λλ€.
- psycopgμμ μΆ©λμ΄ λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
- AI λͺ¨λν°λ§μ΄ νμ±νλ κ²½μ°μλ§ MCP μ€ν¬μ΄ κΈ°λ‘λλλ‘ λ³΄μ₯ν©λλ€.
λμ΄μ€κΈ° ν¨ν€μ§ μμΈμ ν΅ν΄ easy_install/pip/distribute μ¬μ©νμ¬ μμ΄μ νΈλ₯Ό μ€μΉνκ±°λ λ΄λ λ¦ λ€μ΄λ‘λ μ¬μ΄νΈ μμ μ§μ λ€μ΄λ‘λνμΈμ.
μ κ±°λ κΈ°λ₯
λμ΄λΉκΉ 3.7μ λν μ§μ μ κ±°
- λμ΄3.7μ 2023λ 6μ 27μΌμ λ¨μ’ λμμ΅λλ€. μ μ°©μ μμ΄μ νΈκ° μ΄μ λν μ§μμ μ€λ¨νμ΅λλ€.
λ€μν λ μ΄μ μ¬μ©λμ§ μλ APIλ₯Ό μ κ±°ν©λλ€.
λ€μ APIκ° μ κ±°λμμ΅λλ€.
ꡬν API λ체 API accept_distributed_trace_payloadaccept_distributed_trace_headersadd_custom_parameteradd_custom_attributeadd_custom_parametersadd_custom_attributescreate_distributed_trace_payloadinsert_distributed_trace_headersget_browser_timing_footerμ΄ κΈ°λ₯μ get_browser_timing_header()μ λνλμμ΅λλ€.record_exceptionnotice_error()NewRelicLogHandlerNewRelicLogForwardingHandlerlambda_handler&LambdaHandlerWrapperμ΄λ¬ν APIλ newrelic-lambdaν¨ν€μ§λ‘ μ΄λλμμ΅λλ€.
λ€μν λ μ΄μ μ¬μ©λμ§ μλ μ€μ μ μ κ±°ν©λλ€.
λ€μ μ€μ μ΄ μ κ±°λμμ΅λλ€.
ꡬν μ€μ κ΅μ²΄ μ€μ transaction_tracer.capture_attributestransaction_tracer.attributes.enablederror_collector.capture_attributeserror_collector.attributes.enabledbrowser_monitoring.capture_attributesbrowser_monitoring.attributes.enabledanalytics_events.enabledtransaction_events.enabledanalytics_events.capture_attributestransaction_events.attributes.enablederror_collector.ignore_errorserror_collector.ignore_classesstrip_exception_messages.whiteliststrip_exception_messages.allowlistsslμ΄μ μ΄ νλͺ©μ trueμ νλμ½λ©λμ΄ μ€μ μ΅μ μμ μ κ±°λμμ΅λλ€.ignored_paramsλμ newrelic.attributes.exclude = request.parameters.{name}μ¬μ©νμΈμ. κ° μμ² ν νλ¦Ώ, ν€λ₯Ό μΌνλ‘ κ΅¬λΆνμ¬newrelic.attributes.excludeλͺ©λ‘μ μΆκ°ν©λλ€. ν€ μμrequest.parametersκΌ μΆκ°νμΈμ.agent_limits.merge_stats_maximumμ΄μ μλ² μΈ‘ ꡬμ±μ μ νΈνμ¬ μ΄ λ¬Έμ λ μμ ν 무μλμμ΅λλ€.
λ μ΄μ μ¬μ©λμ§ μλ κΈ°λ₯
aioredis μ λν μΈ‘μ , μ¬μ©μ΄ λ μ΄μ μ¬μ©λμ§ μμ΅λλ€.
- aioredis ν¨ν€μ§λ λ μ΄μ μ¬μ©λμ§ μμΌλ©°, μ΄μ νμ λͺ¨λ
redis.asyncioν¬ν¨λ redisκ° μ¬μ©λ©λλ€. κ²°κ³Όμ μΌλ‘aioredisμ λν μΈ‘μ , κ³μΈ‘λ λ μ΄μ μ¬μ©λμ§ μμ΅λλ€. λμredisλΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμΈμ. μ΄ μΈ‘μ , λ‘κ·Έλ ν₯ν 릴리μ€μμ μ κ±°λ μμ μ λλ€.
- aioredis ν¨ν€μ§λ λ μ΄μ μ¬μ©λμ§ μμΌλ©°, μ΄μ νμ λͺ¨λ
λ€λ₯Έ μΈμ΄ μμ΄μ νΈμ μΌμΉνλλ‘ μΌλΆ κΈ°μ‘΄ μν μ€μ μ λ μ΄μ μ¬μ©νμ§ μμ΅λλ€.
λ€λ₯Έ μΈμ΄ μμ΄μ νΈμ κ·μΉκ³Ό μΌκ΄μ±μ μ μ§νκΈ° μν΄ λ€μ μν μ€μ μ λ μ΄μ μ¬μ©λμ§ μμ΅λλ€.
ꡬν μ€μ κ΅μ²΄ μ€μ event_harvest_config.harvest_limits.analytic_event_datatransaction_events.max_samples_storedevent_harvest_config.harvest_limits.span_event_dataspan_events.max_samples_storedevent_harvest_config.harvest_limits.error_event_dataerror_collector.max_event_samples_storedevent_harvest_config.harvest_limits.custom_event_datacustom_insights_events.max_samples_storedevent_harvest_config.harvest_limits.log_event_dataapplication_logging.forwarding.max_samples_storedμ΄λ μ΄λ¬ν μ€μ μ μ΄λ¦μ
*.max_samples_storedμμevent_harvest_config.harvest_limits.*νμμΌλ‘ λ³κ²½ν μ΄μ λ³κ²½ μ¬νμ λλλ¦° κ²μ λλ€. μ΄ κ²°μ μ λ€μ§νκ³ , μλ μ€μ μ μ΄λ¬ν μ€μ μ΄λ¦μ λ³κ²½νμ§ μμ λ€λ₯Έ μΈμ΄ μμ΄μ νΈμ μΌμΉνλλ‘ λ³΅μλμμ΅λλ€. λ μ΄μ μ¬μ©λμ§ μλ μ€μ μ νμ¬λ‘λ κ³μ μλνμ§λ§, ν₯ν 릴리μ€μμλ μ κ±°λ μμ μ λλ€.
WSGI νκ²½ μ¬μ μ ν΅ν΄ μμ΄μ νΈ μ€μ μ λ μ΄μ μ¬μ©νμ§ μμ΅λλ€.
μ΄μ μλ WSGI environ μ¬μ μ ν΅ν΄ ꡬμ±ν μ μμλ λ€μ μ€μ μ λ μ΄μ μ¬μ©λμ§ μμ΅λλ€. νκ²½ λ³μλ κ΅¬μ± νμΌμ ν΅ν΄ μ΄λ¬ν μ€μ μ ꡬμ±νμΈμ.
newrelic.set_background_tasknewrelic.suppress_apdex_metricnewrelic.suppress_transaction_tracenewrelic.capture_request_paramsnewrelic.disable_browser_autorum
setuptools<61.2λλ λ₯Ό μ¬μ©νμ¬ μμ΄μ νΈλ₯Ό λΉλνλ λ° λν μ§μμ λ μ΄μ μ¬μ©νμ§ μμ΅λλ€.setuptools_scm<6.4setuptoolsλ°setuptools_scmμ μ΅μ μ§μ λ²μ μ΄ κ°κ°61.2λ°6.4μΌλ‘ μ¦κ°νμ΅λλ€. μ΄λ ν¨ν€μ§ λ©νλ°μ΄ν° κ΅¬μ± λ° λΉλ μ§μΉ¨μpyproject.tomlλ₯Ό μ¬μ©ν μ μλλ‘ μ§μνκΈ° μν κ²μ λλ€. μ΄μ μμ΄μ νΈλ λ νλμ μΈ λΉλ λκ΅¬λ‘ λΉλλ μ μμΌλ©°, λ μ΄μpyproject.tomlνμΌμ΄ μλ€λ κ²½κ³ λ₯Ό λ°μμν€μ§ μμ΅λλ€.- μ΄ λ³κ²½ μ¬νμ ν¨ν€μ§
newrelic.__version__λ°newrelic.__version_tuple__μ μλ‘μ΄ λ²μ μμ±μ μΆκ°ν©λλ€. μ΄λ₯Ό ν΅ν΄ λ°νμμ μμ΄μ νΈ λ²μ μ νλ‘κ·Έλλ° λ°©μμΌλ‘ νμΈν μ μμ΅λλ€.
μλ‘μ΄ κΈ°λ₯
AutoGenμ λν μ μΈ‘μ , λ‘κ·Έλ₯Ό μΆκ°ν©λλ€.
- AutoGenμ μμ΄μ νΈ λ° λꡬμ λν μΈ‘μ , λ‘κ·Έ(λͺ
λͺ
λ λ²μ λ° μ¬μ©μ μ μ
Llmμ΄λ²€νΈ)λ₯Ό μΆκ°ν©λλ€.
- AutoGenμ μμ΄μ νΈ λ° λꡬμ λν μΈ‘μ , λ‘κ·Έ(λͺ
λͺ
λ λ²μ λ° μ¬μ©μ μ μ
Pyzeebeμ λν μλ‘μ΄ μΈ‘μ , λ‘κ·Έλ₯Ό μΆκ°ν©λλ€.
- Pyzeebeμ λν μλ μΈ‘μ , 리μμ€ λ° νλ μμν¬ κ΄λ ¨ μμ΄μ νΈ μμ±μ μΆκ°ν©λλ€.
μλ‘μ΄ MCP(λͺ¨λΈ 컨ν μ€νΈ νλ‘ν μ½)λΌλ μ΄λ¦μ spanμ μΆκ°ν©λλ€.
- Streamable HTTPλ₯Ό μ§μνκΈ° μν΄ λꡬ κ΄λ¦¬μλ₯Ό ν΅ν΄ μνλ MCP(λͺ¨λΈ 컨ν μ€νΈ νλ‘ν μ½) λꡬ νΈμΆμ λν μλ‘μ΄ λͺ λͺ λ μ€ν¬μ μΆκ°ν©λλ€.
λ²κ·Έ μμ
psycopg>=3.2.0μμ νΈμΆ μ λ°μνλ μΆ©λμ μμ ν©λλ€.as_string()as_string()λ©μλκ° λ μ΄μ μΈμλ₯Ό νμλ‘ νμ§ μμ μ μ¬μ μΈ μΆ©λμ μΌμΌν€λpsycopg>=3.2.0μ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€. μ΄ λ¬Έμ λ ν΄κ²°λμμΌλ©°, μ΄ λ©μλμ λ κ°μ§ μλͺ μ΄ λͺ¨λ μ§μλ©λλ€.
AI λͺ¨λν°λ§μ΄ νμ±νλ κ²½μ°μλ§ MCP(λͺ¨λΈ 컨ν μ€νΈ νλ‘ν μ½) μ€ν¬μ΄ κΈ°λ‘λλλ‘ λ³΄μ₯ν©λλ€.
- MCP(λͺ¨λΈ 컨ν
μ€νΈ νλ‘ν μ½) μ€ν¬μ μ€μ
ai_monitoring.enabledνμ±νλ κ²½μ°μλ§ κΈ°λ‘λ©λλ€.
- MCP(λͺ¨λΈ 컨ν
μ€νΈ νλ‘ν μ½) μ€ν¬μ μ€μ
μ§μ§ μ±λͺ
μ΅μ μμ΄μ νΈ λ²μ μ΄ μΆμλλ©΄ μ¦μ μ λ°μ΄νΈνλ κ²μ΄ μ’μ΅λλ€. μ΅μ λ²μ μΌλ‘ μ κ·Έλ μ΄λν μ μλ κ²½μ°, μμ΄μ νΈλ₯Ό 90μΌ μ΄λ΄ λ²μ μΌλ‘ μ λ°μ΄νΈνμΈμ. μμ΄μ νΈμκ² μ΅μ μ 보λ₯Ό μ 곡νλ λ°©λ²μ λν΄ μμΈν μμ보μΈμ.
μμ΄μ νΈ λ¦΄λ¦¬μ€ λ° μ§μ λ μ§μ λν μ 보λ λ΄λ λ¦ λμ΄ λΉκΈ°λ μμ΄μ νΈ EOL μ μ± μ μ°Έμ‘°νμΈμ.
Notes
μ΄λ² λ¦΄λ¦¬μ€ μμ΄μ νΈμλ λ€μμ λν μ§μμ΄ μΆκ°λμμ΅λλ€.
- Celeryμ μ¬μ©μ μ μ μμ
- κ·Έλν-Django λͺ¨λν°λ§
- Djangoμ λ―Έλ€μ¨μ΄ νν°λ§
- AWS Bedrock Converse API
- W3CTraceParent ν€λ μνλ§ νλκ·Έ
μ΄ λ¦΄λ¦¬μ€μμλ λ€μκ³Ό κ°μ μμ μ¬νλ μ 곡λ©λλ€.
- GraphQLμμ κ°μ₯ κΉμ κ³ μ κ²½λ‘μ λν λ³΄νΈ μ₯μΉ
- μΉ URL μμ² κ΅¬λ¬Έ λΆμμ μν 보μ μ‘°μΉ
- ElasticSearch λ° GraphQLμ λν λ체
trace.settings==None - λΉλκΈ° ElasticSearch ν΄λΌμ΄μΈνΈ λͺ©λ‘μμ
optionsλ©μλ μ κ±°
λμ΄μ€κΈ° ν¨ν€μ§ μμΈμ ν΅ν΄ easy_install/pip/distribute μ¬μ©νμ¬ μμ΄μ νΈλ₯Ό μ€μΉνκ±°λ λ΄λ λ¦ λ€μ΄λ‘λ μ¬μ΄νΈ μμ μ§μ λ€μ΄λ‘λνμΈμ.
μλ‘μ΄ κΈ°λ₯
Celeryμμ μ¬μ©μ μ μ μμ μ λν μ§μμ μΆκ°ν©λλ€.
- Celery μμ μ¬μ©μ μ μ μμ ν΄λμ€μ λν λͺ¨λν°λ§ μ§μμ μΆκ°ν©λλ€. μ΄μ μλ κΈ°λ³Έ μμ ν΄λμ€λ₯Ό μ¬μ©νλ μμ λ§ λͺ¨λν°λ§ν μ μμμ΅λλ€. μ°Έκ³ : μ΄ λ²μ μ λμ΄λΉκΉ μμ΄μ νΈλ λ μ΄μ v5.2.0 λ―Έλ§μ Celery λ²μ μ μ§μνμ§ μμ΅λλ€.
Graphene-Djangoμ λν μ§μμ μΆκ°ν©λλ€.
- Graphene-Django λ‘ μμ±λ λκΈ° μ€ν€λ§μ λν λͺ¨λν°λ§ μ§μμ μΆκ°ν©λλ€. μ΄μ μλ Graphene-Djangoλ‘ μμ±λ μ€ν€λ§κ° λΆλΆμ μΌλ‘λ§ λͺ¨λν°λ§λμ΄ GraphQL κ΄λ ¨ μμ±μ΄ λλ½λμμ΅λλ€.
Djangoμμ λ―Έλ€μ¨μ΄ νν°λ§μ λν μ§μμ μΆκ°ν©λλ€.
μ΄μ μ¬μ©μλ λͺ¨λν°λ§ν Django λ―Έλ€μ¨μ΄λ₯Ό νν°λ§ν μ μμ΅λλ€. μ΄μ μΈ κ°μ§ μΆκ° μ€μ μ΄ μμ΅λλ€.
instrumentation.middleware.django.enabled(κΈ°λ³Έκ°μtrueμ λλ€)instrumentation.middleware.django.excludeinstrumentation.middleware.django.include
μμΈν λ΄μ©κ³Ό μμ λ Django λ―Έλ€μ¨μ΄ νν°λ§ νμ΄μ§λ₯Ό μ°Έμ‘°νμΈμ.
AWS Bedrock Converse APIμ λν μ§μμ μΆκ°ν©λλ€.
- μ€νΈλ¦¬λ°μ΄ μλ Converse APIμ λν λͺ¨λν°λ§ μ§μμ μΆκ°ν©λλ€. μ¬κΈ°μλ
boto3λ°aioboto3ν΄λΌμ΄μΈνΈλ₯Ό μ¬μ©νμ¬ μνλconverseμ±ν μλ£ νΈμΆμ λν μ§μμ΄ ν¬ν¨λ©λλ€.
- μ€νΈλ¦¬λ°μ΄ μλ Converse APIμ λν λͺ¨λν°λ§ μ§μμ μΆκ°ν©λλ€. μ¬κΈ°μλ
W3CTraceParent ν€λ μνλ§ νλκ·Έμ λν μ§μμ μΆκ°ν©λλ€.
- μ μ€νΈλ¦Ό μλΉμ€κ° μνλ§ νλκ·Έκ° μ€μ λ W3CTraceParent ν€λλ₯Ό 보λ΄λ©΄ λ΄λ λ¦μ currentResourcesλ₯Ό μνλ§ν μ§ μ¬λΆλ₯Ό κ²°μ ν λ ν΄λΉ μνλ§ κ²°μ μ κ³ λ €ν©λλ€.
μ격 λΆλͺ¨κ° μνλ§λμλμ§ μ¬λΆμ λ°λΌ μνλ§ κ²°μ μ λν μ§μμ΄ μΆκ°λμμ΅λλ€.
λ κ°μ§ μλ‘μ΄ μ€μ μ΅μ μ λν μ§μμ΄ μΆκ°λμμ΅λλ€.
distributed_tracing.sampler.remote_parent_sampleddistributed_tracing.sampler.remote_parent_not_sampled
defaultκΈ°λ³Έ λμμ΄λ©° μ΄ λ³κ²½ μ΄μ κ³Ό λμΌνκ² λμν©λλ€(νΈλμμ μ μνλ§ν μ§ μ¬λΆλ₯Ό κ²°μ νκΈ° μν΄ μνλ§ κ²°μ μ μ μν μνλ§ μκ³ λ¦¬μ¦μ μ λ¬ν¨).always_onμ¦, μ격 λΆλͺ¨κ° μνλ§λμκ±°λ μνλ§λμ§ μμ νΈλ μ΄μ€λ νμ μνλ§λ©λλ€.always_offμ¦, μ격 λΆλͺ¨κ° μνλ§λμκ±°λ μνλ§λμ§ μμ μ격 λΆλͺ¨κ° μλ νΈλ μ΄μ€λ μ λ μνλ§λμ§ μμ΅λλ€.
λ²κ·Έ μμ
GraphQLμμ κ°μ₯ κΉμ κ³ μ κ²½λ‘μ λν λ³΄νΈ κΈ°λ₯ μΆκ°
- μΌλΆ μ¬μ©μλ GraphQL μμ νλ μ΄λ¦μ΄
Noneλ°ννμ¬ κ°μ₯ κΉμ κ³ μ κ²½λ‘κ° μμ±λμ§ μλ λ¬Έμ λ₯Ό κ²½ννμ΅λλ€. μ΄ λ¬Έμ λ ν΄κ²°λμμ΅λλ€.
- μΌλΆ μ¬μ©μλ GraphQL μμ νλ μ΄λ¦μ΄
μΉ μμ² κ΅¬λ¬Έ λΆμμ μν λ³΄νΈ κΈ°λ₯ μΆκ°
- μΌλΆ μ¬μ©μλ
request_uriμλͺ» νμνλμκ±°λ μλͺ»λ λ¬Έμλ₯Ό ν¬ν¨νκ³ μμ΄ κ΅¬λ¬Έ λΆμ μ€λ₯λ₯Ό κ²½ννμ΅λλ€. μμ² ν€λμrequest_uriμ΄ μ ν¨νμ§ μκ³ μλ μ 곡λ (μ ν¨ν) URLκ³Ό μΌμΉνμ§ μλ κ²½μ° μ΄ λ¬Έμ κ° λ°μν μ μμ΅λλ€. μ΄ λ³΄νΈ μ₯μΉλ νμ¬ λ΄λ λ¦μ μ μ©λμμ§λ§,urllibμμλ 2025λ 1μ 31μΌ μ΄νμ μΆμλ λ²μ μ λν μ΄ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
- μΌλΆ μ¬μ©μλ
ElasticSearch λ° GraphQLμμ μΆ©λμ μμ ν©λλ€.
trace.settings==Nonetrace.settingsμ΄NoneμΈ κ²½μ° ElasticSearchμ λν μΈ‘μ , 리μμ€κ° μλμ μ€λ¨νμ΅λλ€.global_settingsλμμ΄ λ§λ ¨λμμ΅λλ€. μ΄λ GraphQLμμ λ°κ²¬λλ λμΌν λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
λΉλκΈ° ElasticSearch ν΄λΌμ΄μΈνΈ λͺ©λ‘μμ
optionsλ©μλ μ κ±°- μ΄μ μΈ‘μ , ElasticSearchμ κ³μΈ‘μ
optionsλΉλκΈ° λ©μλ λͺ©λ‘μ μκΈ° λλ¬Έμ μΆ©λμ΄ λ°μνμ΅λλ€. μ΄ λ©μλλ μ΄λ ν λ°μ΄ν°μ€ν μ΄ μμ /requests λ μννμ§ μμΌλ―λ‘ λ μ΄μDatastoreTraceμ λνλμ§ μμ΅λλ€.
- μ΄μ μΈ‘μ , ElasticSearchμ κ³μΈ‘μ
μ§μ§ μ±λͺ
μ΅μ μμ΄μ νΈ λ²μ μ΄ μΆμλλ©΄ μ¦μ μ λ°μ΄νΈνλ κ²μ΄ μ’μ΅λλ€. μ΅μ λ²μ μΌλ‘ μ κ·Έλ μ΄λν μ μλ κ²½μ°, μμ΄μ νΈλ₯Ό 90μΌ μ΄λ΄ λ²μ μΌλ‘ μ λ°μ΄νΈνμΈμ. μμ΄μ νΈμκ² μ΅μ μ 보λ₯Ό μ 곡νλ λ°©λ²μ λν΄ μμΈν μμ보μΈμ.
μμ΄μ νΈ λ¦΄λ¦¬μ€ λ° μ§μ λ μ§μ λν μ 보λ λ΄λ λ¦ λμ΄ λΉκΈ°λ μμ΄μ νΈ EOL μ μ± μ μ°Έμ‘°νμΈμ.
Notes
This release of the Python agent adds support for new Redis functions, convert all internal paths from os.path to pathlib.Path, and fixes an issue with JSON encoding PosixPaths.
Install the agent using easy_install/pip/distribute via the Python Package Index or download it directly from the New Relic download site.
New features
Adds support for new Redis functions
- Add instrumentation for new Redis functions.
Convert all internal paths from
os.pathtopathlib.Path- Convert all internal usage of string based paths and
os.pathtopathlib.Pathin preparation to support Windows paths.
- Convert all internal usage of string based paths and
Bug fixes
Fix issue with JSON encoding PosixPath
- Some users were experiencing issues with JSON encoding
PosixPathconfiguration settings. This issue has been fixed.
- Some users were experiencing issues with JSON encoding
Support statement
We recommend updating to the latest agent version as soon as it's available. If you can't upgrade to the latest version, update your agents to a version no more than 90 days old. Read more about keeping agents up to date.
See the New Relic Python agent EOL policy for information about agent releases and support dates.