newrelic / newrelic-python-agent

New Relic Python Agent
https://docs.newrelic.com/docs/agents/python-agent
Apache License 2.0
168 stars 97 forks source link

Conflict dependencies chroma db and opentelemetry-proto #1154

Open anaclaramatos opened 4 weeks ago

anaclaramatos commented 4 weeks ago

Conflict dependencies chroma db and opentelemetry-proto.

Description

When trying to run a project with newrelic and chroma db the following error is thrown:

ERROR collecting tests/controllers/test_features_controller.py
(...)
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*opentelemetry/proto/common/v1/common.proto\(...)
TypeError: Couldn't build proto file into descriptor pool: duplicate file name opentelemetry/proto/common/v1/common.proto

The error is thrown because the following files are different:

newrelic is using opentelemetry-proto==1.0.0 and chromadb uses opentelemetry-proto==1.24.0

Your Environment

newrelic==9.10.0 chromadb==0.4.24 opentelemetry-proto==1.24.0

Additional context

Stack trace:

===================================================================================== ERRORS ======================================================================================
_________________________________________________________ ERROR collecting tests/controllers/test_features_controller.py __________________________________________________________
tests/controllers/test_features_controller.py:8: in <module>
  from api.main import app
api/main.py:12: in <module>
  from api.cc_agent import CCAgentController
api/cc_agent/__init__.py:1: in <module>
  from api.cc_agent.config import (
api/cc_agent/config.py:2: in <module>
  from cc_agent.chat_model import AzureOpenAIEngine
../ai-cc-agent/cc_agent/chat_model.py:4: in <module>
  import chromadb
venv/lib/python3.10/site-packages/chromadb/__init__.py:5: in <module>
  from chromadb.auth.token import TokenTransportHeader
venv/lib/python3.10/site-packages/chromadb/auth/token/__init__.py:26: in <module>
  from chromadb.telemetry.opentelemetry import (
venv/lib/python3.10/site-packages/chromadb/telemetry/opentelemetry/__init__.py:11: in <module>
  from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
venv/lib/python3.10/site-packages/opentelemetry/exporter/otlp/proto/grpc/trace_exporter/__init__.py:24: in <module>
  from opentelemetry.exporter.otlp.proto.common.trace_encoder import (
venv/lib/python3.10/site-packages/opentelemetry/exporter/otlp/proto/common/trace_encoder.py:16: in <module>
  from opentelemetry.exporter.otlp.proto.common._internal.trace_encoder import (
venv/lib/python3.10/site-packages/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py:31: in <module>
  from opentelemetry.proto.common.v1.common_pb2 import (
venv/lib/python3.10/site-packages/opentelemetry/proto/common/v1/common_pb2.py:17: in <module>
  DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*opentelemetry/proto/common/v1/common.proto\x12\x1dopentelemetry.proto.common.v1\"\x8c\x02\n\x08\x41nyValue\x12\x16\n\x0cstring_value\x18\x01 \x01(\tH\x00\x12\x14\n\nbool_value\x18\x02 \x01(\x08H\x00\x12\x13\n\tint_value\x18\x03 \x01(\x03H\x00\x12\x16\n\x0c\x64ouble_value\x18\x04 \x01(\x01H\x00\x12@\n\x0b\x61rray_value\x18\x05 \x01(\x0b\x32).opentelemetry.proto.common.v1.ArrayValueH\x00\x12\x43\n\x0ckvlist_value\x18\x06 \x01(\x0b\x32+.opentelemetry.proto.common.v1.KeyValueListH\x00\x12\x15\n\x0b\x62ytes_value\x18\x07 \x01(\x0cH\x00\x42\x07\n\x05value\"E\n\nArrayValue\x12\x37\n\x06values\x18\x01 \x03(\x0b\x32\'.opentelemetry.proto.common.v1.AnyValue\"G\n\x0cKeyValueList\x12\x37\n\x06values\x18\x01 \x03(\x0b\x32\'.opentelemetry.proto.common.v1.KeyValue\"O\n\x08KeyValue\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.opentelemetry.proto.common.v1.AnyValue\"\x94\x01\n\x14InstrumentationScope\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12;\n\nattributes\x18\x03 \x03(\x0b\x32\'.opentelemetry.proto.common.v1.KeyValue\x12 \n\x18\x64ropped_attributes_count\x18\x04 \x01(\rB{\n io.opentelemetry.proto.common.v1B\x0b\x43ommonProtoP\x01Z(go.opentelemetry.io/proto/otlp/common/v1\xaa\x02\x1dOpenTelemetry.Proto.Common.V1b\x06proto3')
E  TypeError: Couldn't build proto file into descriptor pool: duplicate file name opentelemetry/proto/common/v1/common.proto
workato-integration[bot] commented 4 weeks ago

https://new-relic.atlassian.net/browse/NR-274826

hmstepanek commented 2 weeks ago

This is going to sound a little weird but try adding the following to the top level file in your program:

import newrelic.agent
settings = newrelic.agent.global_settings()
settings.debug.otlp_content_encoding = "json"

The otlp is only used for instrumenting sklearn right now so as long as you aren't using that/wanting that instrumentation you should be ok to disable the agent from using otlp/using json instead (this should prevent that conflict of building that proto file with the same name).