Add error handling to opentelemetry-bootstrap -a (#2517)

* Revert "Refactor bootstrap generation (#2101)"

This reverts commit 1ee7261ea7117fbd22e2262e488402213a874125.

* Add error handling to opentelemetry-bootstrap -a

Fixes #2516

---------

Co-authored-by: Tammy Baylis <96076570+tammy-baylis-swi@users.noreply.github.com>
This commit is contained in:
Diego Hurtado
2024-05-14 15:26:31 -05:00
committed by GitHub
parent 6a40ffd905
commit d0500c2f8a
3 changed files with 47 additions and 45 deletions

View File

@ -14,8 +14,14 @@
import argparse
import logging
import subprocess
import sys
from subprocess import (
PIPE,
CalledProcessError,
Popen,
SubprocessError,
check_call,
)
import pkg_resources
@ -34,7 +40,7 @@ def _syscall(func):
if package:
return func(package)
return func()
except subprocess.SubprocessError as exp:
except SubprocessError as exp:
cmd = getattr(exp, "cmd", None)
if cmd:
msg = f'Error calling system command "{" ".join(cmd)}"'
@ -48,18 +54,21 @@ def _syscall(func):
@_syscall
def _sys_pip_install(package):
# explicit upgrade strategy to override potential pip config
subprocess.check_call(
[
sys.executable,
"-m",
"pip",
"install",
"-U",
"--upgrade-strategy",
"only-if-needed",
package,
]
)
try:
check_call(
[
sys.executable,
"-m",
"pip",
"install",
"-U",
"--upgrade-strategy",
"only-if-needed",
package,
]
)
except CalledProcessError as error:
print(error)
def _pip_check():
@ -70,8 +79,8 @@ def _pip_check():
'opentelemetry-instrumentation-flask 1.0.1 has requirement opentelemetry-sdk<2.0,>=1.0, but you have opentelemetry-sdk 0.5.'
To not be too restrictive, we'll only check for relevant packages.
"""
with subprocess.Popen(
[sys.executable, "-m", "pip", "check"], stdout=subprocess.PIPE
with Popen(
[sys.executable, "-m", "pip", "check"], stdout=PIPE
) as check_pipe:
pip_check = check_pipe.communicate()[0].decode()
pip_check_lower = pip_check.lower()

View File

@ -24,6 +24,10 @@ libraries = [
"library": "aiohttp ~= 3.0",
"instrumentation": "opentelemetry-instrumentation-aiohttp-client==0.46b0.dev",
},
{
"library": "aiohttp ~= 3.0",
"instrumentation": "opentelemetry-instrumentation-aiohttp-server==0.46b0.dev",
},
{
"library": "aiopg >= 0.13.0, < 2.0.0",
"instrumentation": "opentelemetry-instrumentation-aiopg==0.46b0.dev",
@ -187,6 +191,7 @@ default_instrumentations = [
"opentelemetry-instrumentation-dbapi==0.46b0.dev",
"opentelemetry-instrumentation-logging==0.46b0.dev",
"opentelemetry-instrumentation-sqlite3==0.46b0.dev",
"opentelemetry-instrumentation-threading==0.46b0.dev",
"opentelemetry-instrumentation-urllib==0.46b0.dev",
"opentelemetry-instrumentation-wsgi==0.46b0.dev",
]

View File

@ -12,55 +12,43 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from tomli import load
from os import path, listdir
from subprocess import check_output, CalledProcessError
from requests import get
import os
import subprocess
from subprocess import CalledProcessError
scripts_path = path.dirname(path.abspath(__file__))
root_path = path.dirname(scripts_path)
instrumentations_path = path.join(root_path, "instrumentation")
import tomli
scripts_path = os.path.dirname(os.path.abspath(__file__))
root_path = os.path.dirname(scripts_path)
instrumentations_path = os.path.join(root_path, "instrumentation")
def get_instrumentation_packages():
for pkg in sorted(listdir(instrumentations_path)):
pkg_path = path.join(instrumentations_path, pkg)
if not path.isdir(pkg_path):
for pkg in sorted(os.listdir(instrumentations_path)):
pkg_path = os.path.join(instrumentations_path, pkg)
if not os.path.isdir(pkg_path):
continue
error = f"Could not get version for package {pkg}"
try:
hatch_version = check_output(
version = subprocess.check_output(
"hatch version",
shell=True,
cwd=pkg_path,
universal_newlines=True
universal_newlines=True,
)
except CalledProcessError as exc:
print(f"Could not get hatch version from path {pkg_path}")
print(exc.output)
raise exc
try:
response = get(f"https://pypi.org/pypi/{pkg}/json", timeout=10)
except Exception:
print(error)
continue
if response.status_code != 200:
print(error)
continue
pyproject_toml_path = path.join(pkg_path, "pyproject.toml")
pyproject_toml_path = os.path.join(pkg_path, "pyproject.toml")
with open(pyproject_toml_path, "rb") as file:
pyproject_toml = load(file)
pyproject_toml = tomli.load(file)
instrumentation = {
"name": pyproject_toml["project"]["name"],
"version": hatch_version.strip(),
"version": version.strip(),
"instruments": pyproject_toml["project"]["optional-dependencies"][
"instruments"
],