From 0318691b6eb94975e1159ff6256de2a880e1ba91 Mon Sep 17 00:00:00 2001 From: Arnaud Bergeron Date: Wed, 11 Sep 2024 12:01:36 -0400 Subject: [PATCH 1/5] add otel config for clockwork_web --- clockwork_web/main.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/clockwork_web/main.py b/clockwork_web/main.py index 7512081d..147270ce 100644 --- a/clockwork_web/main.py +++ b/clockwork_web/main.py @@ -64,6 +64,7 @@ ) register_config("logging.journald", False, validator=boolean) +register_config("logging.otel", "", validator=string) logger = logging.getLogger() @@ -126,6 +127,28 @@ def format(self, record): logging.info("Logging to journald") +if get_config("logging.otel") != "": + from opentelemetry._logs import set_logger_provider + from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter + from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler + from opentelemetry.sdk._logs.export import BatchLogRecordProcessor + from opentelemetry.sdk.resources import Resource + + logger_provider = LoggerProvider( + resource=Resource.create( + { + "service.name": "clockwork", + "service.instance.id": os.uname().nodename, + } + ), + ) + set_logger_provider(logger_provider) + + otlp_exporter = OTLPLogExporter(endpoint=get_config("logging.otel"), insecure=True) + logger_provider.add_log_record_processor(BatchLogRecordProcessor(otlp_exporter)) + handler = LoggingHandler(level=logging.NOTSET, logger_provider=logger_provider) + logger.addHandler(handler) + sentry_dns = get_config("sentry.dns") if sentry_dns: # Not sure about how sentry works, but it probably does From 7938cb1275accd489ab0e7bdb32e56fec440759d Mon Sep 17 00:00:00 2001 From: Arnaud Bergeron Date: Wed, 11 Sep 2024 12:05:45 -0400 Subject: [PATCH 2/5] add dependencies for otel logs to the docs --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7f0fb312..58d2e1c1 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,8 @@ Used: ```bash # for main project python3 -m pip install flask flask-login numpy pymongo oauthlib coverage black ldap3 toml +# if you want to OTLP log exporter +python3 -m pip opentelemetry-sdk opentelemetry-exporter-otlp # for docs python3 -m pip install sphinx myst_parser sphinx_rtd_theme sphinxcontrib.httpdomain ``` From 8455d79c7ff2732fdcce5b6f532e9469158771c3 Mon Sep 17 00:00:00 2001 From: Arnaud Bergeron Date: Wed, 11 Sep 2024 13:03:26 -0400 Subject: [PATCH 3/5] Fix sentry dns typo --- clockwork_web/main.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/clockwork_web/main.py b/clockwork_web/main.py index 147270ce..00c3eb5a 100644 --- a/clockwork_web/main.py +++ b/clockwork_web/main.py @@ -36,6 +36,7 @@ register_config("flask.testing", False, validator=boolean) register_config("flask.login_disabled", False, validator=boolean) +register_config("sentry.dsn", "", validator=string) register_config("sentry.dns", "", validator=string) register_config("sentry.traces_sample_rate", 1.0, validator=anything) @@ -149,8 +150,10 @@ def format(self, record): handler = LoggingHandler(level=logging.NOTSET, logger_provider=logger_provider) logger.addHandler(handler) -sentry_dns = get_config("sentry.dns") -if sentry_dns: +sentry_dsn = get_config("sentry.dsn") +if not sentry_dsn: + sentry_dsn = get_config("sentry.dns") # Old typo +if sentry_dsn: # Not sure about how sentry works, but it probably does # some behind-the-scenes things before the flask components # are loaded. It's not clear to me if we really need to ensure @@ -162,7 +165,7 @@ def format(self, record): from sentry_sdk.integrations.flask import FlaskIntegration sentry_sdk.init( - dsn=sentry_dns, + dsn=sentry_dsn, integrations=[ FlaskIntegration(), ], @@ -171,10 +174,10 @@ def format(self, record): # We recommend having a lower value in production. traces_sample_rate=get_config("sentry.traces_sample_rate"), ) - logging.info("Loaded sentry logging at %s.", sentry_dns) + logging.info("Loaded sentry logging at %s.", sentry_dsn) else: logging.info( - "Not loading sentry because the sentry.dns config is empty or is missing." + "Not loading sentry because the sentry.dsn config is empty or is missing." ) From 5b75c6304139ff54a535b21b7fcc5d266c5037dd Mon Sep 17 00:00:00 2001 From: Arnaud Bergeron Date: Wed, 11 Sep 2024 17:41:39 -0400 Subject: [PATCH 4/5] add comment explaning almost duplicate config --- clockwork_web/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clockwork_web/main.py b/clockwork_web/main.py index 00c3eb5a..cfa67fa8 100644 --- a/clockwork_web/main.py +++ b/clockwork_web/main.py @@ -37,7 +37,7 @@ register_config("flask.login_disabled", False, validator=boolean) register_config("sentry.dsn", "", validator=string) -register_config("sentry.dns", "", validator=string) +register_config("sentry.dns", "", validator=string) # deprecated because typo register_config("sentry.traces_sample_rate", 1.0, validator=anything) LOGGING_LEVEL_MAPPING = dict( From a9bd10e3cca8993dcf9dcb659d6097475ddd9599 Mon Sep 17 00:00:00 2001 From: Arnaud Bergeron Date: Wed, 11 Sep 2024 17:48:29 -0400 Subject: [PATCH 5/5] reformat code --- clockwork_web/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clockwork_web/main.py b/clockwork_web/main.py index cfa67fa8..b5c9dac7 100644 --- a/clockwork_web/main.py +++ b/clockwork_web/main.py @@ -138,10 +138,10 @@ def format(self, record): logger_provider = LoggerProvider( resource=Resource.create( { - "service.name": "clockwork", - "service.instance.id": os.uname().nodename, + "service.name": "clockwork", + "service.instance.id": os.uname().nodename, } - ), + ), ) set_logger_provider(logger_provider)