From 8d05e441aa39fe35b15d28bd013d97e0752ade6e Mon Sep 17 00:00:00 2001 From: Janet Cui Date: Mon, 12 Jan 2026 13:28:58 +1100 Subject: [PATCH 1/5] [otel container]: Create otel container for HFT (#23666) [otel container]: Create otel container for HFT --- Makefile.work | 1 + dockers/docker-sonic-otel/Dockerfile.j2 | 74 +++++++++++++++++++ .../base_image_files/monit_otel | 5 ++ dockers/docker-sonic-otel/critical_processes | 2 + dockers/docker-sonic-otel/otel.sh | 38 ++++++++++ dockers/docker-sonic-otel/start.sh | 14 ++++ dockers/docker-sonic-otel/supervisord.conf | 58 +++++++++++++++ files/build_templates/otel.service.j2 | 15 ++++ .../build_templates/sonic_debian_extension.j2 | 8 ++ files/image_config/logrotate/rsyslog.j2 | 1 + files/image_config/otel/otel_config.yml | 38 ++++++++++ .../rsyslog/rsyslog.d/00-sonic.conf.j2 | 15 ++++ files/scripts/otel.sh | 1 + rules/config | 3 + rules/docker-otel.dep | 11 +++ rules/docker-otel.mk | 40 ++++++++++ slave.mk | 6 ++ .../health_checker/service_checker.py | 6 ++ 18 files changed, 336 insertions(+) create mode 100644 dockers/docker-sonic-otel/Dockerfile.j2 create mode 100644 dockers/docker-sonic-otel/base_image_files/monit_otel create mode 100644 dockers/docker-sonic-otel/critical_processes create mode 100644 dockers/docker-sonic-otel/otel.sh create mode 100644 dockers/docker-sonic-otel/start.sh create mode 100644 dockers/docker-sonic-otel/supervisord.conf create mode 100644 files/build_templates/otel.service.j2 create mode 100644 files/image_config/otel/otel_config.yml create mode 120000 files/scripts/otel.sh create mode 100644 rules/docker-otel.dep create mode 100644 rules/docker-otel.mk diff --git a/Makefile.work b/Makefile.work index 23a3e272fe..8ccb42a09c 100644 --- a/Makefile.work +++ b/Makefile.work @@ -538,6 +538,7 @@ SONIC_BUILD_INSTRUCTION := $(MAKE) \ SONIC_INCLUDE_SYSTEM_GNMI=$(INCLUDE_SYSTEM_GNMI) \ SONIC_INCLUDE_SYSTEM_BMP=$(INCLUDE_SYSTEM_BMP) \ SONIC_INCLUDE_SYSTEM_EVENTD=$(INCLUDE_SYSTEM_EVENTD) \ + SONIC_INCLUDE_SYSTEM_OTEL=$(INCLUDE_SYSTEM_OTEL) \ INCLUDE_DHCP_RELAY=$(INCLUDE_DHCP_RELAY) \ INCLUDE_DHCP_SERVER=$(INCLUDE_DHCP_SERVER) \ INCLUDE_MACSEC=$(INCLUDE_MACSEC) \ diff --git a/dockers/docker-sonic-otel/Dockerfile.j2 b/dockers/docker-sonic-otel/Dockerfile.j2 new file mode 100644 index 0000000000..8c2af9c772 --- /dev/null +++ b/dockers/docker-sonic-otel/Dockerfile.j2 @@ -0,0 +1,74 @@ +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE AS base + +ARG docker_container_name +ARG image_version + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +RUN apt-get update + +{% if docker_sonic_otel_debs.strip() -%} +# Copy locally-built Debian package dependencies +{{ copy_files("debs/", docker_sonic_otel_debs.split(' '), "/debs/") }} + +# Install locally-built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_sonic_otel_debs.split(' ')) }} +{%- endif %} + +# Install dependencies +RUN apt-get install -y \ + ca-certificates \ + curl \ + wget + +# Install OpenTelemetry Collector from official .deb package +ARG OTEL_VERSION=0.114.0 + +# Download and install official .deb package with architecture-specific logic +{% if CONFIGURED_ARCH == "armhf" %} +RUN wget -v -O /tmp/otelcol-contrib.deb \ + "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v${OTEL_VERSION}/otelcol-contrib_${OTEL_VERSION}_linux_armv7.deb" && \ + dpkg --info /tmp/otelcol-contrib.deb && \ + (dpkg -i /tmp/otelcol-contrib.deb || apt-get install -f -y) && \ + ln -sf /usr/bin/otelcol-contrib /usr/local/bin/otelcol-contrib && \ + rm /tmp/otelcol-contrib.deb +{% elif CONFIGURED_ARCH == "arm64" %} +RUN wget -v -O /tmp/otelcol-contrib.deb \ + "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v${OTEL_VERSION}/otelcol-contrib_${OTEL_VERSION}_linux_arm64.deb" && \ + dpkg --info /tmp/otelcol-contrib.deb && \ + (dpkg -i /tmp/otelcol-contrib.deb || apt-get install -f -y) && \ + ln -sf /usr/bin/otelcol-contrib /usr/local/bin/otelcol-contrib && \ + rm /tmp/otelcol-contrib.deb +{% else %} +RUN wget -v -O /tmp/otelcol-contrib.deb \ + "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v${OTEL_VERSION}/otelcol-contrib_${OTEL_VERSION}_linux_amd64.deb" && \ + dpkg --info /tmp/otelcol-contrib.deb && \ + (dpkg -i /tmp/otelcol-contrib.deb || apt-get install -f -y) && \ + ln -sf /usr/bin/otelcol-contrib /usr/local/bin/otelcol-contrib && \ + rm /tmp/otelcol-contrib.deb +{% endif %} + +COPY ["start.sh", "otel.sh", "/usr/bin/"] +RUN chmod +x /usr/bin/start.sh /usr/bin/otel.sh +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["critical_processes", "/etc/supervisor"] + +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=/proc --exclude=/dev --exclude=resolv.conf /changes-to-image/ / + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +ENTRYPOINT ["/usr/local/bin/supervisord"] + diff --git a/dockers/docker-sonic-otel/base_image_files/monit_otel b/dockers/docker-sonic-otel/base_image_files/monit_otel new file mode 100644 index 0000000000..913a0728e5 --- /dev/null +++ b/dockers/docker-sonic-otel/base_image_files/monit_otel @@ -0,0 +1,5 @@ +############################################################################### +## Monit configuration for otel container +############################################################################### +check program container_memory_telemetry with path "/usr/bin/memory_checker otel 419430400" + if status == 3 for 10 times within 20 cycles then exec "/usr/bin/restart_service otel" repeat every 2 cycles diff --git a/dockers/docker-sonic-otel/critical_processes b/dockers/docker-sonic-otel/critical_processes new file mode 100644 index 0000000000..6fb17d8c67 --- /dev/null +++ b/dockers/docker-sonic-otel/critical_processes @@ -0,0 +1,2 @@ +program:otel + diff --git a/dockers/docker-sonic-otel/otel.sh b/dockers/docker-sonic-otel/otel.sh new file mode 100644 index 0000000000..6bfa62800a --- /dev/null +++ b/dockers/docker-sonic-otel/otel.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +EXIT_OTEL_CONFIG_FILE_NOT_FOUND=1 +OTEL_CONFIG_FILE=/etc/sonic/otel_config.yml + +echo "Starting otel.sh script" +echo "Checking for config file: $OTEL_CONFIG_FILE" + +if [ ! -f "$OTEL_CONFIG_FILE" ]; then + echo "ERROR: OTEL config file not found at $OTEL_CONFIG_FILE" + exit $EXIT_OTEL_CONFIG_FILE_NOT_FOUND +fi + +echo "Config file found at: $OTEL_CONFIG_FILE" + +# Validate the YAML configuration +echo "Validating YAML configuration..." +python3 -c "import yaml; yaml.safe_load(open(\"$OTEL_CONFIG_FILE\"))" 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR: YAML configuration is invalid" + exit 1 +fi + +OTEL_ARGS="--config=$OTEL_CONFIG_FILE" + +echo "Checking otelcol-contrib binary" +ls -la /usr/local/bin/otelcol-contrib + +if [ ! -x "/usr/local/bin/otelcol-contrib" ]; then + echo "ERROR: otelcol-contrib binary not found or not executable" + exit 1 +fi + +echo "otel collector args: $OTEL_ARGS" +echo "Starting OTEL Collector with config file: $OTEL_CONFIG_FILE" + +exec /usr/local/bin/otelcol-contrib ${OTEL_ARGS} + diff --git a/dockers/docker-sonic-otel/start.sh b/dockers/docker-sonic-otel/start.sh new file mode 100644 index 0000000000..c91a4e06d8 --- /dev/null +++ b/dockers/docker-sonic-otel/start.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +if [ "${RUNTIME_OWNER}" == "" ]; then + RUNTIME_OWNER="kube" +fi + +CTR_SCRIPT="/usr/share/sonic/scripts/container_startup.py" +if test -f ${CTR_SCRIPT} +then + ${CTR_SCRIPT} -f otel -o ${RUNTIME_OWNER} -v ${IMAGE_VERSION} +fi + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status diff --git a/dockers/docker-sonic-otel/supervisord.conf b/dockers/docker-sonic-otel/supervisord.conf new file mode 100644 index 0000000000..c9e336b20f --- /dev/null +++ b/dockers/docker-sonic-otel/supervisord.conf @@ -0,0 +1,58 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[eventlistener:dependent-startup] +command=python3 -m supervisord_dependent_startup +autostart=true +autorestart=unexpected +startretries=0 +exitcodes=0,3 +events=PROCESS_STATE +buffer_size=1024 + +[eventlistener:supervisor-proc-exit-listener] +command=/usr/local/bin/supervisor-proc-exit-listener --container-name otel +events=PROCESS_STATE_EXITED,PROCESS_STATE_RUNNING +autostart=true +autorestart=unexpected +buffer_size=1024 + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE +priority=1 +autostart=false +autorestart=true +stdout_logfile=NONE +stdout_syslog=true +stderr_logfile=NONE +stderr_syslog=true +dependent_startup=true + +[program:start] +command=/usr/bin/start.sh +priority=2 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=NONE +stdout_syslog=true +stderr_logfile=NONE +stderr_syslog=true +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running + +[program:otel] +command=/usr/bin/otel.sh +priority=3 +autostart=false +autorestart=true +startsecs=0 +stdout_logfile=NONE +stdout_syslog=true +stderr_logfile=NONE +stderr_syslog=true +dependent_startup=true +dependent_startup_wait_for=start:exited + diff --git a/files/build_templates/otel.service.j2 b/files/build_templates/otel.service.j2 new file mode 100644 index 0000000000..673ecf89b0 --- /dev/null +++ b/files/build_templates/otel.service.j2 @@ -0,0 +1,15 @@ +[Unit] +Description=Otel container +Requires=database.service +Before=swss.service +BindsTo=sonic.target +After=sonic.target +StartLimitIntervalSec=1200 +StartLimitBurst=3 + +[Service] +User={{ sonicadmin_user }} +ExecStartPre=/usr/local/bin/{{docker_container_name}}.sh start +ExecStart=/usr/local/bin/{{docker_container_name}}.sh wait +ExecStop=/usr/local/bin/{{docker_container_name}}.sh stop +RestartSec=30 diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index f70355a93a..5784f56fff 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -651,6 +651,13 @@ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl disable dash-engine {%- endif %} +{%- if include_system_otel == "y" %} + +# Copy OTEL configuration files +sudo cp $IMAGE_CONFIGS/otel/otel_config.yml $FILESYSTEM_ROOT/etc/sonic/ + +{%- endif %} + # Copy platform topology configuration scripts sudo cp $IMAGE_CONFIGS/config-topology/config-topology.service $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM echo "config-topology.service" | sudo tee -a $GENERATED_SERVICE_FILE @@ -1032,6 +1039,7 @@ sudo LANG=C cp $SCRIPTS_DIR/database.sh $FILESYSTEM_ROOT/usr/local/bin/database. sudo LANG=C cp $SCRIPTS_DIR/snmp.sh $FILESYSTEM_ROOT/usr/local/bin/snmp.sh sudo LANG=C cp $SCRIPTS_DIR/telemetry.sh $FILESYSTEM_ROOT/usr/local/bin/telemetry.sh sudo LANG=C cp $SCRIPTS_DIR/gnmi.sh $FILESYSTEM_ROOT/usr/local/bin/gnmi.sh +sudo LANG=C cp $SCRIPTS_DIR/otel.sh $FILESYSTEM_ROOT/usr/local/bin/otel.sh sudo LANG=C cp $SCRIPTS_DIR/bmp.sh $FILESYSTEM_ROOT/usr/local/bin/bmp.sh sudo LANG=C cp $SCRIPTS_DIR/mgmt-framework.sh $FILESYSTEM_ROOT/usr/local/bin/mgmt-framework.sh sudo LANG=C cp $SCRIPTS_DIR/asic_status.sh $FILESYSTEM_ROOT/usr/local/bin/asic_status.sh diff --git a/files/image_config/logrotate/rsyslog.j2 b/files/image_config/logrotate/rsyslog.j2 index b0a7ff7e70..11bc2cb239 100644 --- a/files/image_config/logrotate/rsyslog.j2 +++ b/files/image_config/logrotate/rsyslog.j2 @@ -31,6 +31,7 @@ /var/log/teamd.log /var/log/telemetry.log /var/log/gnmi.log +/var/log/otel.log /var/log/frr/bgpd.log /var/log/frr/zebra.log /var/log/swss/sairedis*.rec diff --git a/files/image_config/otel/otel_config.yml b/files/image_config/otel/otel_config.yml new file mode 100644 index 0000000000..56046916f7 --- /dev/null +++ b/files/image_config/otel/otel_config.yml @@ -0,0 +1,38 @@ +receivers: + otlp: + protocols: + grpc: + endpoint: "127.0.0.1:4317" + http: + endpoint: "127.0.0.1:4318" + +processors: + batch: + timeout: 1s + send_batch_size: 1000 + +exporters: + debug: + verbosity: detailed + +service: + telemetry: + logs: + level: "info" + + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [debug] + + logs: + receivers: [otlp] + processors: [batch] + exporters: [debug] + + traces: + receivers: [otlp] + processors: [batch] + exporters: [debug] + diff --git a/files/image_config/rsyslog/rsyslog.d/00-sonic.conf.j2 b/files/image_config/rsyslog/rsyslog.d/00-sonic.conf.j2 index 1aa223db21..acd447c7a5 100644 --- a/files/image_config/rsyslog/rsyslog.d/00-sonic.conf.j2 +++ b/files/image_config/rsyslog/rsyslog.d/00-sonic.conf.j2 @@ -46,3 +46,18 @@ if $msg startswith " telemetry" or ($msg startswith " dialout" )then { /var/log/telemetry.log stop } + +## otel rules +if $msg startswith " otel" then { + /var/log/otel.log + stop +} + +## stpd rules +if $programname contains "stp" then { + if not ($msg contains "STP_SYSLOG") then { + /var/log/stpd.log + stop + } +} + diff --git a/files/scripts/otel.sh b/files/scripts/otel.sh new file mode 120000 index 0000000000..ce97295f03 --- /dev/null +++ b/files/scripts/otel.sh @@ -0,0 +1 @@ +service_mgmt.sh \ No newline at end of file diff --git a/rules/config b/rules/config index 439880abbc..c57e611d6b 100644 --- a/rules/config +++ b/rules/config @@ -133,6 +133,9 @@ INCLUDE_SYSTEM_EVENTD = y # INCLUDE_SYSTEM_TELEMETRY - build docker-sonic-telemetry for system telemetry support INCLUDE_SYSTEM_TELEMETRY = n +# INCLUDE_SYSTEM_OTEL - build docker-sonic-otel for High Frequency Telemetry (HFT) support +INCLUDE_SYSTEM_OTEL = y + # INCLUDE_ICCPD - build docker-iccpd for mclag support INCLUDE_ICCPD = n diff --git a/rules/docker-otel.dep b/rules/docker-otel.dep new file mode 100644 index 0000000000..b47c7f6af9 --- /dev/null +++ b/rules/docker-otel.dep @@ -0,0 +1,11 @@ +DPATH := $($(DOCKER_OTEL)_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/docker-otel.mk rules/docker-otel.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(DPATH)) + +$(DOCKER_OTEL)_CACHE_MODE := GIT_CONTENT_SHA +$(DOCKER_OTEL)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DOCKER_OTEL)_DEP_FILES := $(DEP_FILES) + +$(eval $(call add_dbg_docker,$(DOCKER_OTEL),$(DOCKER_OTEL_DBG))) + diff --git a/rules/docker-otel.mk b/rules/docker-otel.mk new file mode 100644 index 0000000000..d368e2135e --- /dev/null +++ b/rules/docker-otel.mk @@ -0,0 +1,40 @@ +# docker image for otel collector + +DOCKER_OTEL_STEM = docker-sonic-otel +DOCKER_OTEL = $(DOCKER_OTEL_STEM).gz +DOCKER_OTEL_DBG = $(DOCKER_OTEL_STEM)-$(DBG_IMAGE_MARK).gz + +$(DOCKER_OTEL)_PATH = $(DOCKERS_PATH)/$(DOCKER_OTEL_STEM) + +$(DOCKER_OTEL)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BOOKWORM)_DBG_DEPENDS) +$(DOCKER_OTEL)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BOOKWORM) +$(DOCKER_OTEL)_VERSION = 1.0.0 +$(DOCKER_OTEL)_PACKAGE_NAME = otel +$(DOCKER_OTEL)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BOOKWORM)_DBG_IMAGE_PACKAGES) + +SONIC_DOCKER_IMAGES += $(DOCKER_OTEL) +SONIC_BOOKWORM_DOCKERS += $(DOCKER_OTEL) +ifeq ($(INCLUDE_SYSTEM_OTEL), y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_OTEL) +endif + +SONIC_DOCKER_DBG_IMAGES += $(DOCKER_OTEL_DBG) +SONIC_BOOKWORM_DBG_DOCKERS += $(DOCKER_OTEL_DBG) +ifeq ($(INCLUDE_SYSTEM_OTEL), y) +SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_OTEL_DBG) +endif + +$(DOCKER_OTEL)_CONTAINER_NAME = otel +$(DOCKER_OTEL)_RUN_OPT += -t +$(DOCKER_OTEL)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_OTEL)_RUN_OPT += -v /etc/localtime:/etc/localtime:ro +$(DOCKER_OTEL)_RUN_OPT += -v /:/mnt/host:ro +$(DOCKER_OTEL)_RUN_OPT += -v /tmp:/mnt/host/tmp:rw +$(DOCKER_OTEL)_RUN_OPT += -v /var/tmp:/mnt/host/var/tmp:rw +$(DOCKER_OTEL)_RUN_OPT += --pid=host +$(DOCKER_OTEL)_RUN_OPT += --privileged +$(DOCKER_OTEL)_RUN_OPT += --userns=host + +$(DOCKER_OTEL)_BASE_IMAGE_FILES += monit_otel:/etc/monit/conf.d + + diff --git a/slave.mk b/slave.mk index f3d9ad3e23..a471bbbdf7 100644 --- a/slave.mk +++ b/slave.mk @@ -170,6 +170,10 @@ ifeq ($(SONIC_INCLUDE_SYSTEM_GNMI),y) INCLUDE_SYSTEM_GNMI = y endif +ifeq ($(SONIC_INCLUDE_SYSTEM_OTEL),y) +INCLUDE_SYSTEM_OTEL = y +endif + ifeq ($(SONIC_INCLUDE_SYSTEM_BMP),y) INCLUDE_SYSTEM_BMP = y endif @@ -444,6 +448,7 @@ $(info "INCLUDE_ICCPD" : "$(INCLUDE_ICCPD)") $(info "INCLUDE_SYSTEM_TELEMETRY" : "$(INCLUDE_SYSTEM_TELEMETRY)") $(info "INCLUDE_SYSTEM_GNMI" : "$(INCLUDE_SYSTEM_GNMI)") $(info "INCLUDE_SYSTEM_BMP" : "$(INCLUDE_SYSTEM_BMP)") +$(info "INCLUDE_SYSTEM_OTEL" : "$(INCLUDE_SYSTEM_OTEL)") $(info "INCLUDE_SYSTEM_EVENTD" : "$(INCLUDE_SYSTEM_EVENTD)") $(info "ENABLE_HOST_SERVICE_ON_START" : "$(ENABLE_HOST_SERVICE_ON_START)") $(info "INCLUDE_RESTAPI" : "$(INCLUDE_RESTAPI)") @@ -1437,6 +1442,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ export sonic_su_mode="$(SECURE_UPGRADE_MODE)" export sonic_su_prod_signing_tool="/sonic/scripts/$(shell basename -- $(SECURE_UPGRADE_PROD_SIGNING_TOOL))" export include_system_telemetry="$(INCLUDE_SYSTEM_TELEMETRY)" + export include_system_otel="$(INCLUDE_SYSTEM_OTEL)" export include_system_gnmi="$(INCLUDE_SYSTEM_GNMI)" export include_system_bmp="$(INCLUDE_SYSTEM_BMP)" export include_system_eventd="$(INCLUDE_SYSTEM_EVENTD)" diff --git a/src/system-health/health_checker/service_checker.py b/src/system-health/health_checker/service_checker.py index 10ec7e6785..c35b095d1d 100644 --- a/src/system-health/health_checker/service_checker.py +++ b/src/system-health/health_checker/service_checker.py @@ -112,6 +112,12 @@ def get_expected_running_containers(self, feature_table): else: container_list.append("gnmi") continue + # Some platforms may not include the OTEL container; skip expecting it when image absent + if container_name == "otel": + if not check_docker_image("docker-sonic-otel"): + logger.log_debug("Ignoring otel container check on image which has no corresponding docker image") + continue + container_list.append(container_name) for container_name in container_list: From 4161f7516669f8e58486261701ea797d0907570d Mon Sep 17 00:00:00 2001 From: Janet Cui Date: Mon, 19 Jan 2026 16:08:44 +1100 Subject: [PATCH 2/5] fix service name (#25107) Why I did it This PR fixes a service name conflict in the otel container's monit configuration. The monit program check name was incorrectly using container_memory_telemetry instead of container_memory_otel, which would conflict with the telemetry container's monitoring configuration. Work item tracking Microsoft ADO (number only): How I did it Fixed a service name conflict in the otel container's monit configuration. Signed-off-by: Janet Cui Co-authored-by: Ze Gan --- dockers/docker-sonic-otel/base_image_files/monit_otel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-sonic-otel/base_image_files/monit_otel b/dockers/docker-sonic-otel/base_image_files/monit_otel index 913a0728e5..1db285b2ca 100644 --- a/dockers/docker-sonic-otel/base_image_files/monit_otel +++ b/dockers/docker-sonic-otel/base_image_files/monit_otel @@ -1,5 +1,5 @@ ############################################################################### ## Monit configuration for otel container ############################################################################### -check program container_memory_telemetry with path "/usr/bin/memory_checker otel 419430400" +check program container_memory_otel with path "/usr/bin/memory_checker otel 419430400" if status == 3 for 10 times within 20 cycles then exec "/usr/bin/restart_service otel" repeat every 2 cycles From 2e14fec5c9cf9a1c15a91e34e6975cdcc47ef23e Mon Sep 17 00:00:00 2001 From: Janet Cui Date: Tue, 20 Jan 2026 04:32:30 +0000 Subject: [PATCH 3/5] enable buildkit Signed-off-by: Janet Cui --- rules/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/config b/rules/config index c57e611d6b..e4c898267c 100644 --- a/rules/config +++ b/rules/config @@ -26,7 +26,7 @@ DEFAULT_BUILD_LOG_TIMESTAMP = none # This options will speed up docker image build time. # NOTE: SONIC_USE_DOCKER_BUILDKIT will produce larger installable SONiC image # because of a docker bug (more details: https://github.com/moby/moby/issues/38903) -# SONIC_USE_DOCKER_BUILDKIT = y +SONIC_USE_DOCKER_BUILDKIT = y # SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD - use native dockerd for build. # If set to y SONiC build container will use native dockerd instead of dind for faster build. From 99d08e8b388aa7f157a207e35013f98c8274132b Mon Sep 17 00:00:00 2001 From: Janet Cui Date: Wed, 21 Jan 2026 00:41:32 +0000 Subject: [PATCH 4/5] use multistage copy in dockerfile Signed-off-by: Janet Cui --- dockers/docker-sonic-otel/Dockerfile.j2 | 3 +-- rules/config | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/dockers/docker-sonic-otel/Dockerfile.j2 b/dockers/docker-sonic-otel/Dockerfile.j2 index 8c2af9c772..81ce52ab07 100644 --- a/dockers/docker-sonic-otel/Dockerfile.j2 +++ b/dockers/docker-sonic-otel/Dockerfile.j2 @@ -62,7 +62,7 @@ COPY ["critical_processes", "/etc/supervisor"] FROM $BASE -RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=/proc --exclude=/dev --exclude=resolv.conf /changes-to-image/ / +COPY --from=base / / ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -71,4 +71,3 @@ ENV DEBIAN_FRONTEND=noninteractive ENV IMAGE_VERSION=$image_version ENTRYPOINT ["/usr/local/bin/supervisord"] - diff --git a/rules/config b/rules/config index e4c898267c..c57e611d6b 100644 --- a/rules/config +++ b/rules/config @@ -26,7 +26,7 @@ DEFAULT_BUILD_LOG_TIMESTAMP = none # This options will speed up docker image build time. # NOTE: SONIC_USE_DOCKER_BUILDKIT will produce larger installable SONiC image # because of a docker bug (more details: https://github.com/moby/moby/issues/38903) -SONIC_USE_DOCKER_BUILDKIT = y +# SONIC_USE_DOCKER_BUILDKIT = y # SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD - use native dockerd for build. # If set to y SONiC build container will use native dockerd instead of dind for faster build. From bb783e83909139b443b4f8a6e7083fcf424c1ffc Mon Sep 17 00:00:00 2001 From: Janet Cui Date: Wed, 21 Jan 2026 05:14:09 +0000 Subject: [PATCH 5/5] remove multistage build Signed-off-by: Janet Cui --- dockers/docker-sonic-otel/Dockerfile.j2 | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/dockers/docker-sonic-otel/Dockerfile.j2 b/dockers/docker-sonic-otel/Dockerfile.j2 index 81ce52ab07..5a15512c5c 100644 --- a/dockers/docker-sonic-otel/Dockerfile.j2 +++ b/dockers/docker-sonic-otel/Dockerfile.j2 @@ -60,14 +60,4 @@ RUN chmod +x /usr/bin/start.sh /usr/bin/otel.sh COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["critical_processes", "/etc/supervisor"] -FROM $BASE - -COPY --from=base / / - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -# Pass the image_version to container -ENV IMAGE_VERSION=$image_version - ENTRYPOINT ["/usr/local/bin/supervisord"]