census-instrumentation / opencensus-python

A stats collection and distributed tracing framework
Apache License 2.0
669 stars 250 forks source link

Importing "from opencensus.ext.azure.log_exporter import AzureLogHandler" takes 0.6 -2.4 seconds #1176

Open et-at-micro opened 1 year ago

et-at-micro commented 1 year ago

Describe your environment. python 3.10.8 opencensus-ext-azure==1.1.7 mac Ventura or windows 11. macbook pro 16 inch core i9 windows Intel 8700k

Steps to reproduce. time python -c "from opencensus.ext.azure.log_exporter import AzureLogHandler" vs time python -c "" What is the expected behavior? Similar runtime. What is the actual behavior? time python -c "" # ~0.1-0.13 seconds time python -c "from opencensus.ext.azure.log_exporter import AzureLogHandler" # ~0.7 - 2.6 seconds

Importing opencensus.ext.azure.log_exporter takes between 0.6 - 2.5 seconds to import.

Additional context. This limits the ability to use opencensus.ext.azure in any cli application where startup times are crucial. I tried lazy loading the module but that gives me errors. Adding here profiling of import: image

lzchen commented 1 year ago

@et-at-micro

Thanks for doing this analysis. Curious would you be able to get the import time statistics for the trace and metrics exporters as well and compare them?

et-at-micro commented 1 year ago

@lzchen

trace_exporter metrics_exporter

Updates: Just the import without python bootime etc we are looking at ~690-760ms for all the tools. The biggest single impact is with the import to MSAL that imports http.server (python standard library) that takes ~300ms and opencensus.ext.azure.common.transport already explicitly imports requests (external http server) that takes ~100ms. That alone can save 30% of total import time. The second is opencensus.trace.status that makes up for another 30% of import time. this import google rpc and pkg_resources.

I did not see any large differences in metrics, logs or traces in import time or the biggest time consumers.