From defdc88d5ca3badae43b0d89bf3fd1a444db4b46 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 3 Jun 2025 11:31:41 +0000 Subject: [PATCH] Add new telemetry app --- kitchen_counter/telemetry/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 171 bytes .../__pycache__/admin.cpython-312.pyc | Bin 0 -> 215 bytes .../__pycache__/apps.cpython-312.pyc | Bin 0 -> 4108 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 212 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 1347 bytes kitchen_counter/telemetry/admin.py | 3 + kitchen_counter/telemetry/apps.py | 78 ++++++++++++++++++ .../telemetry/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 182 bytes kitchen_counter/telemetry/models.py | 3 + kitchen_counter/telemetry/tests.py | 3 + kitchen_counter/telemetry/utils.py | 16 ++++ kitchen_counter/telemetry/views.py | 3 + 14 files changed, 107 insertions(+) create mode 100644 kitchen_counter/telemetry/__init__.py create mode 100644 kitchen_counter/telemetry/__pycache__/__init__.cpython-312.pyc create mode 100644 kitchen_counter/telemetry/__pycache__/admin.cpython-312.pyc create mode 100644 kitchen_counter/telemetry/__pycache__/apps.cpython-312.pyc create mode 100644 kitchen_counter/telemetry/__pycache__/models.cpython-312.pyc create mode 100644 kitchen_counter/telemetry/__pycache__/utils.cpython-312.pyc create mode 100644 kitchen_counter/telemetry/admin.py create mode 100644 kitchen_counter/telemetry/apps.py create mode 100644 kitchen_counter/telemetry/migrations/__init__.py create mode 100644 kitchen_counter/telemetry/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 kitchen_counter/telemetry/models.py create mode 100644 kitchen_counter/telemetry/tests.py create mode 100644 kitchen_counter/telemetry/utils.py create mode 100644 kitchen_counter/telemetry/views.py diff --git a/kitchen_counter/telemetry/__init__.py b/kitchen_counter/telemetry/__init__.py new file mode 100644 index 0000000..21deb90 --- /dev/null +++ b/kitchen_counter/telemetry/__init__.py @@ -0,0 +1 @@ +#default_app_config = "telemetry.apps.TelemetryConfig" diff --git a/kitchen_counter/telemetry/__pycache__/__init__.cpython-312.pyc b/kitchen_counter/telemetry/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0648a960b83f113136b7baddd969e223e4fb56ec GIT binary patch literal 171 zcmX@j%ge<81eezvW|#x%#~=gjEsy$%s>_Z27&-6`tjvhU8L|Mg3BgfAwP~3MpB#QYo$t$Chn1vZT_AU2L6f8SX|}dY8-2 zF4fAQf*gF%p#^HRfO6=;Mhql|1;mH+)jCFRDg zfh?qbZ{FX$c{}sH;Xfjg5FpRxzf7(~BLI9(2mJBZnZ17#W)mnt5p-Y(k|0ptqkAL| zqh86&s88|{>ec;5KngG$pWb3X2^v8u$i{v>WQ3(K;{&>AM5Kt(Dz&n4iyk%Fq&CJw z{eaOfwKG1b$BYiCgYhA~)98}A7$4TVjUK6o@uJ>q#HBdnBYK~akP=3})X&DP`a$E6 zbcpd${jhOFI>Pui{itzFIwk-QxCoR3w}8^F3J<)_nx%m?Pcrs39V7)DJXCc5MqwbBk0s^V_0{ zY!Y0+k;^J!nq2!ARiv4UmUE1>!ZNWS31-wRO^3v$Q5=~Y$AeqvSl&F4GbYZLvIRwF ze%&l5VwO>JCQ_Oci_(xp!{gm2vz*Uo3(Mwg!Lm`wPz$z+a!zrbw@@GKbrEJ0s6Y}F zKz5Wsc9Z88kbG<2qz^}zR9&S7UUNPG4%%Fh;}K|}Ao-`?ZZAM~?Iy5YUEV|0`yWM6 zJhqR^>=u`!QP}f<(|R1mYlrJ1kQX`Epxj>bKB#-F3pP7h)F$8Bu;g6+0OuN1@hScX z^?cVoc8qK6PR`|Nv7UMO+;$IF@EF!byO+z#!dAe|&1?6$a?e(aEBBSX`F^fxQ2P+) z%RX+)sQ{X?JIw7GwCq-dSTHrA;}l!*WahB-b>k{VM0n zkmt=Qi8aNw_B7}6r#RQ3TS4x#9<*QM^89JeHK-Eemie;{Dd);=95VNd#yQ8m8}xr? z%QN_YbMQUz<1%%l{D?f2up-i4u^ytmq8xH#&NkM}Ij$oeCaeH`a6PO(bb9Q>RBG(x zRO$qwlT*_Z<72Oqh5}K&zfoQ-C`D5%*hvpckYsQxMQ<%9Bi4Rsm-Op24IEHdgFqDU zPzQN^O`((M!;6UcJMAd>GJ-TpAV>U3pQ8wky`-feir?5{S~#$*+C@#lEoxy^LuLVc zi2#Q*OCzl(TOfUvUSx2LNM+Ws8@(A(h(;98aeG!#WQ(*`+PIyDi^9y0_Vj1{0?dU* zB&%y`_K4h}0HSb@qRfOkKV#BHwY29T3WvCdPOO{Dq(HQ*Hcj77ZD^aoEkwUedNKCR z&RPs|%-iWb7@!C6}~3#oeHX;&e2a+Rd6YZkfQ z*qUykqf{BNY{e|u*guoWEM(YFMJO4;K1-(N_tn1-4zy;CaKr8K!Wtg6T& z>z3bew!D1KRMd2R|I0a(n5ii3mMfht7Ohlq4g2YqUAx)2#0%+MK~hXi8>sbnvSZ%| zU&Q)0&)h!qM2tU9jO~br?#1rC`Qfz>6HmmBKfSZ5-PZniH<9TM=}0 zZBE~w-aLK#^y8yv9-n=y8he|_1E4Mb=fUmxcqKkwji3DVy;}6b&cTs~E471XHWqdg zluMl1xco%y+ZIz5F;z>S{o5QYQ9$tE6Jd$huZ*9!)h_P*Ps3H#Cd5=bbpfCCGcrE_g zMsx@EeXvl2BP43i@IzSZp4t$f!0v50T7jdru}hB<)v>EJc#Z0Zwl01$cYluAka4hW z8}?RU?+3@L@Yps?RbcAlat)r^fzf@6kqR8yy7tNS``2r5`U|eC!oF=dRDnZxh|h%U z!^8s>IB@UUN7wHXj}zaKndXGgV7v+w+ipV=x{dfDTo#_ql@5yH&&wSF4p)6CFlw}-}Wy4fTI^{)K{&gv<*EK#$(G2mp z56}fd(0Tgm<}Z2&vnZh40#CwS@1NiEjr&I(Lu!*8#9`<3rRXk0Ug|eUU!&xOqee-$ zwK@Q?^G<(jI8YbaccvMpAqGRSeTo#t5{uyr?%S`ilpAF4I=@6L2CEL7cK^4TbDSwU z;)Bo8rkvyHfaJ;jM*QTaOj|Fe$a-uuwTz0n6pQN~YzKLJ_xsW;9kj3*n&QLH)$ literal 0 HcmV?d00001 diff --git a/kitchen_counter/telemetry/__pycache__/models.cpython-312.pyc b/kitchen_counter/telemetry/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1f6b2456c1cc469541280870472350b5d438e72 GIT binary patch literal 212 zcmX@j%ge<81fL`gGAx1gV-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zYn zx%nxnImLdOOt&~wvJ&&s^Yv1aikN|tD;Yk6)co?$&&bbB)h|sd%_}L@ch1i%OD!tS z%+HJW&MZmJNX?6P2AZIs4do=~1C^x~>6fJDq~@lU6jka&EYK^c{Ka7dWS8co+7)pC X4Q2%5Vi4m4Gb1D8JqDQ~HXsK8<6$@? literal 0 HcmV?d00001 diff --git a/kitchen_counter/telemetry/__pycache__/utils.cpython-312.pyc b/kitchen_counter/telemetry/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..796e6ad9cac8d9b85f7df9aadd53ddb4e69b7073 GIT binary patch literal 1347 zcmZuv%}*0i5Pz?`OP8`OA4&rfJ`zb_4^U1n%yhxOQ3pY>R2tAl^a%Ml;LY&Rcn>X{DdGqxx9*+?qesiWkBZU0M zOGsiMG$ui)6P@VPBpLst8Gz3bJ+eV`VIMq^GLb4(#Xl&fbI3yq?4)rEGn)Ds7h|vGj3SU({et~crFZyenRj!RzRo|hoTax*pBj5 zP{e*^YQz<7W-fDl-Nq!x#xCYkg>s3d zDlaOQQ%TL1tyRWtqikslhLbBWOPek0EcG(D~vsgH?fo06yL=g z040~^fs2E^YDgY`TG(FNTKf2KcYbGn zFZxrNLG9w!;*m0Xpp1Ts?u~y=94e_Zi73~2FGR_;w-z_WYy52xpz)*#=T#~;*Suv3 zhk*@HX&UPCt6VlKc0r|Hl{UUK=GQg|;^o>rB-U;B0fX9PWjnqVKaz(I`b7Po{+=|iTxE7I&w~cd2aszW84M9 literal 0 HcmV?d00001 diff --git a/kitchen_counter/telemetry/admin.py b/kitchen_counter/telemetry/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/kitchen_counter/telemetry/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/kitchen_counter/telemetry/apps.py b/kitchen_counter/telemetry/apps.py new file mode 100644 index 0000000..9a3478e --- /dev/null +++ b/kitchen_counter/telemetry/apps.py @@ -0,0 +1,78 @@ +from django.apps import AppConfig +import os +import logging +import multiprocessing +from uuid import uuid4 + +from opentelemetry import trace, metrics +from opentelemetry._logs import set_logger_provider +from opentelemetry.sdk.resources import Resource, SERVICE_INSTANCE_ID + +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter + +from opentelemetry.sdk.metrics import MeterProvider +from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader +from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter + +from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler +from opentelemetry.sdk._logs.export import BatchLogRecordProcessor +from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter +from opentelemetry.instrumentation.django import DjangoInstrumentor + +class TelemetryConfig(AppConfig): + name = "telemetry" + + def ready(self): + # Resource Definition + resource = Resource.create({ + "service.name": "development-kitchen", + SERVICE_INSTANCE_ID: str(uuid4()), + "worker": os.getpid(), # os.getpid() works outside Gunicorn too + }) + + endpoint = os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT", "http://129.159.229.69:4317") + + # TRACE SETUP + if not isinstance(trace.get_tracer_provider(), TracerProvider): + tracer_provider = TracerProvider(resource=resource) + span_exporter = OTLPSpanExporter(endpoint=endpoint) + tracer_provider.add_span_processor(BatchSpanProcessor(span_exporter)) + trace.set_tracer_provider(tracer_provider) + + # METRIC SETUP + if not isinstance(metrics.get_meter_provider(), MeterProvider): + metric_reader = PeriodicExportingMetricReader(OTLPMetricExporter(endpoint=endpoint)) + meter_provider = MeterProvider(resource=resource, metric_readers=[metric_reader]) + metrics.set_meter_provider(meter_provider) + + # LOGGING SETUP + # 1. Create and set the logger provider FIRST + logger_provider = LoggerProvider(resource=resource) + set_logger_provider(logger_provider) # MUST be set before using LoggingHandler + + # 2. Add processor and exporter + log_exporter = OTLPLogExporter(endpoint=endpoint) + logger_provider.add_log_record_processor(BatchLogRecordProcessor(log_exporter)) + + # 3. Now safely create the handler (uses global logger provider) + otel_handler = LoggingHandler(level=logging.INFO) + + # 4. Attach to Django and root loggers + logging.getLogger("django").addHandler(otel_handler) + logging.getLogger("django").setLevel(logging.INFO) + + logging.getLogger().addHandler(otel_handler) + logging.getLogger().setLevel(logging.INFO) + + + from opentelemetry.instrumentation.django import DjangoInstrumentor + DjangoInstrumentor().instrument() + + import sys + from .utils import PrintLogger # assuming PrintLogger is defined in telemetry/utils.py + + # Redirect print() and errors to logger so they appear in SigNoz + sys.stdout = PrintLogger(logging.INFO) + sys.stderr = PrintLogger(logging.ERROR) diff --git a/kitchen_counter/telemetry/migrations/__init__.py b/kitchen_counter/telemetry/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/kitchen_counter/telemetry/migrations/__pycache__/__init__.cpython-312.pyc b/kitchen_counter/telemetry/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc647b1a6db3e0b275a71d777aae43930c4a6539 GIT binary patch literal 182 zcmX@j%ge<81fL`gGC=fW5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!3f0fZ&rQ`YO)AYR zDb;t*&nrtUD$dN$i}%hfNzO>ki+9dXN!8DWa+33b%2JE;OHy-Eb5l!-D)n