elastic / elastic/apm-agent-python

Allow flexibility in automatic instrumentation

Ouverte
#470 1 commentaire 1 réaction 0 personnes assignées Voir sur GitHub
agent-python discuss enhancement
Langage dominant
Python
Étoiles
431
Forks
239
Merge moyen
5 j 10 h
PR mergées (30 j)
7

Description

**Is your feature request related to a problem? Please describe.**
Currently we have a single `INSTRUMENTED` config value that turns _all_ instrumentation on/off. I think it would be useful to have some more flexibility.

In my particular use case for example, I would like to customise the `requests` instrumentation in my project which requires me to disable the out-of-the-box instrumentation. The easiest way I've found to do this is:
- Set `INSTRUMENTED: false` in config
- Vendor in logic found in `elasticapm.instrumentation.register`, `elasticapm.instrumentation.control`, to customising the `_cls_register` set to include my own instrumentation for `requests`.
- (Additionally for flask) Subclass `elasticapm.contrib.flask.ElasticAPM`, overriding the `init_app` method so that I can register the `request_started`, `request_finished` signals.

Side note re: flask - I think this may be a bug, depending on your perspective. In other places in the project e.g. Django instrumentation, the `INSTRUMENTED` config value refers only to instrumentation logic found in `elasticapm.instrumentation` (`AbstractInstrumentedModule` subclasses). Whereas in the flask module, it additionally prevents registering of the above flask signals.

**Describe the solution you'd like**
A way to customise exactly what gets instrumented from config, opt-in and opt-out.

**Describe alternatives you've considered**

Possible implementations:
- Exclusion/inclusion override lists of modules to instrument, e.g.
```
Config:
instrument_exclude = ["requests", "celery"]
instrument_include = [("requests", my_custom_instrumentation_module_name)]
```
or
```
Config:
instrument_overrides = [
("requests", my_custom_instrumentation_module_name), # to replace
("celery", None), # to disable
]
```

- Config value that overrides `elasticapm.instrumentation.register._cls_register`. A "raw" solution. This however would require the client to specify the module names which are internal to `elasticapm` (probably less than ideal).

Does anyone have any thoughts on this? Please correct me if I have overlooked something that makes this easy in the current version. Thanks.

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par elasticapm.instrumentation.register, elasticapm.instrumentation.control et l’ensemble _cls_register afin de comprendre l’instrumentation automatique actuelle. Examinez elasticapm.contrib.flask.ElasticAPM.init_app et l’enregistrement de ses signaux Flask. La réalisation doit inclure un mécanisme de configuration défini permettant de sélectionner ou de remplacer l’instrumentation, tout en préservant le comportement prévu de Flask.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
django, flask, python
Domaine
backend, observability-sre
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.