mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-07-27 04:03:09 +08:00
Simplify bootstrap and generate code (#514)
- We now automatically generate bootstrap_gen.py file from the list of instrumentations present in the source tree. - Bootstrap command now uses consumes this auto-generated list instead of keeping it's own local copy. - We no longer uninstall packages before installing them as instrumentation package no longer specify libraries as dependencies so the edge cases are no longer there. - We no longer try to install an incompatible version or force upgrade/downgrade an installed version. This used to leave systems in broken states which should happen no more.
This commit is contained in:
98
scripts/generate_instrumentation_bootstrap.py
Executable file
98
scripts/generate_instrumentation_bootstrap.py
Executable file
@ -0,0 +1,98 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Copyright The OpenTelemetry Authors
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import ast
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
import astor
|
||||
import pkg_resources
|
||||
from otel_packaging import (
|
||||
get_instrumentation_packages,
|
||||
root_path,
|
||||
scripts_path,
|
||||
)
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger("instrumentation_list_generator")
|
||||
|
||||
_auto_generation_msg = """
|
||||
# DO NOT EDIT. THIS FILE WAS AUTOGENERATED FROM templates/{source}.
|
||||
# RUN `python scripts/generate_setup.py` TO REGENERATE.
|
||||
"""
|
||||
|
||||
_template = """
|
||||
{header}
|
||||
|
||||
# DO NOT EDIT. THIS FILE WAS AUTOGENERATED FROM INSTRUMENTATION PACKAGES.
|
||||
# RUN `python scripts/generate_instrumentation_bootstrap.py` TO REGENERATE.
|
||||
|
||||
{source}
|
||||
"""
|
||||
|
||||
_source_tmpl = """
|
||||
libraries = {}
|
||||
default_instrumentations = []
|
||||
"""
|
||||
|
||||
|
||||
gen_path = os.path.join(
|
||||
root_path,
|
||||
"opentelemetry-instrumentation",
|
||||
"src",
|
||||
"opentelemetry",
|
||||
"instrumentation",
|
||||
"bootstrap_gen.py",
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
# pylint: disable=no-member
|
||||
default_instrumentations = ast.List(elts=[])
|
||||
libraries = ast.Dict(keys=[], values=[])
|
||||
for pkg in get_instrumentation_packages():
|
||||
if not pkg["instruments"]:
|
||||
default_instrumentations.elts.append(ast.Str(pkg["requirement"]))
|
||||
for target_pkg in pkg["instruments"]:
|
||||
parsed = pkg_resources.Requirement.parse(target_pkg)
|
||||
libraries.keys.append(ast.Str(parsed.name))
|
||||
libraries.values.append(
|
||||
ast.Dict(
|
||||
keys=[ast.Str("library"), ast.Str("instrumentation")],
|
||||
values=[ast.Str(target_pkg), ast.Str(pkg["requirement"])],
|
||||
)
|
||||
)
|
||||
|
||||
tree = ast.parse(_source_tmpl)
|
||||
tree.body[0].value = libraries
|
||||
tree.body[1].value = default_instrumentations
|
||||
source = astor.to_source(tree)
|
||||
|
||||
with open(
|
||||
os.path.join(scripts_path, "license_header.txt"), "r"
|
||||
) as header_file:
|
||||
header = header_file.read()
|
||||
source = _template.format(header=header, source=source)
|
||||
|
||||
with open(gen_path, "w") as gen_file:
|
||||
gen_file.write(source)
|
||||
|
||||
subprocess.run(["black", "-q", gen_path], check=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Reference in New Issue
Block a user