Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Support OpenTelemetry Azure monitor distro #1509

Merged
merged 25 commits into from
Aug 8, 2024
Merged

Conversation

lzchen
Copy link
Member

@lzchen lzchen commented Jun 11, 2024

Description

We are planning to support auto instrumentation of Azure monitor distro for azure functions. This allows automatic collection of telemetry using OpenTelemetry apis/sdks in users applications in azure functions. The current design is an opt-in model which is controlled by an Appsetting PYTHON_ENABLE_OPENTELEMETRY. The worker takes an indirect dependency on the distro package and attempts to load/instrument with it via configure_azure_monitor() api provided. The idea is to have this package already preinstalled into the functions image. Until the images are pushed out with this package, you may test this change by manually installing the distro onto your dev environment.

Additionally, any exceptions thrown by the distro are caught and logged accordingly. A telemetry sdk should never cause a user's application to crash.

@gavin-aguiar @vrdmr

@lzchen
Copy link
Member Author

lzchen commented Jun 11, 2024

@gavin-aguiar

Since this is a telemetry sdk meant only to be loaded once, I have placed this in worker_init_request. Is there anything special that happens during environment_reload_request that needs to be done pertaining this in your opinion?

@gavin-aguiar
Copy link
Contributor

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@gavin-aguiar
Copy link
Contributor

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@lzchen
Copy link
Member Author

lzchen commented Jul 3, 2024

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@lzchen
Copy link
Member Author

lzchen commented Jul 3, 2024

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@lzchen
Copy link
Member Author

lzchen commented Jul 3, 2024

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@lzchen
Copy link
Member Author

lzchen commented Aug 1, 2024

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@lzchen
Copy link
Member Author

lzchen commented Aug 1, 2024

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@Azure Azure deleted a comment from gavin-aguiar Aug 2, 2024
@gavin-aguiar
Copy link
Contributor

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@lzchen
Copy link
Member Author

lzchen commented Aug 6, 2024

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@gavin-aguiar
Copy link
Contributor

/azp run

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@gavin-aguiar gavin-aguiar merged commit d5c02fb into Azure:dev Aug 8, 2024
12 checks passed
@lzchen lzchen deleted the ot branch August 8, 2024 23:19
@ashleysommer
Copy link

ashleysommer commented Nov 8, 2024

@lzchen
I've started using this new version of Azure Functions Python Worker locally, and I believe after this addition of Azure Monitor Distro feature there is a regression in the previous behaviour even though this new feature is.

I use OpenTelemetry in my app by calling context_api.get_context() to get the current context that is pushed by the Function Worker.
In previous versions, this context was pushed on every invocation if _otel_libs_available is True. After this feature addition, the context is pushed on every invocation only if _azure_monitor_available is True.

_azure_monitor_available is only True under the following condition:

  1. PYTHON_ENABLE_OPENTELEMETRY var is set and
  2. OpenTelemetry python modules are installed and
  3. azure.monitor.opentelemetry python module is installed.

In my case, I do not with to use Azure Monitor Otel Distro, so I have:
PYTHON_ENABLE_OPENTELEMETRY enabled, and OpenTelemetry python modules installed, but azure.monitor.opentelemetry module not installed.
In pre-v4.31, my application works fine (the worker sets the context using context_api.attach(), and I can retrieve it in my app using context_api.get_context(). In v4.31+ the worker does not attach the context on each invocation because _azure_monitor_available is not True.

@lzchen
Copy link
Member Author

lzchen commented Nov 9, 2024

@ashleysommer

We will be rolling out images in which the azure.monitor.opentelemetry module will be pre-installed on the image itself so it will always exist (regardless if (1) is set). Thus, effectively, only (1) and (2) would be needed from the users side.

There is an interim stage in which these images will not be pushed to production yet. If you would like to use the preview version of the worker, you can set the context in code manually for now as a workaround.

@lzchen
Copy link
Member Author

lzchen commented Dec 19, 2024

As a followup to the above, we introduced this pr: #1621

We have decided to use separate app settings to control context propagation and enabling appinsights explitcily, the latter automatically also supports the former.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants