Skip to content

Commit 6a54bc4

Browse files
authored
Streaming structured events implementation (#11848)
With this PR in, you flap BGP and use events_tool to see the published events. With telemetry PR #111 in and corresponding submodule update done in buildimage, one could run gnmi_cli to capture BGP flap events.
1 parent 71d63a7 commit 6a54bc4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+4088
-4
lines changed

dockers/docker-eventd/Dockerfile.j2

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %}
2+
FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}}
3+
4+
ARG docker_container_name
5+
ARG image_version
6+
RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf
7+
8+
# Make apt-get non-interactive
9+
ENV DEBIAN_FRONTEND=noninteractive
10+
11+
# Pass the image_version to container
12+
ENV IMAGE_VERSION=$image_version
13+
14+
# Update apt's cache of available packages
15+
RUN apt-get update
16+
17+
{% if docker_eventd_debs.strip() -%}
18+
# Copy built Debian packages
19+
{{ copy_files("debs/", docker_eventd_debs.split(' '), "/debs/") }}
20+
21+
# Install built Debian packages and implicitly install their dependencies
22+
{{ install_debian_packages(docker_eventd_debs.split(' ')) }}
23+
{%- endif %}
24+
25+
# Clean up
26+
RUN apt-get clean -y && \
27+
apt-get autoclean -y && \
28+
apt-get autoremove -y && \
29+
rm -rf /debs
30+
31+
COPY ["start.sh", "/usr/bin/"]
32+
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
33+
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
34+
COPY ["critical_processes", "/etc/supervisor"]
35+
36+
ENTRYPOINT ["/usr/local/bin/supervisord"]
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
program:eventd

dockers/docker-eventd/start.sh

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/env bash
2+
3+
if [ "${RUNTIME_OWNER}" == "" ]; then
4+
RUNTIME_OWNER="kube"
5+
fi
6+
+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
[supervisord]
2+
logfile_maxbytes=1MB
3+
logfile_backups=2
4+
nodaemon=true
5+
6+
[eventlistener:dependent-startup]
7+
command=python3 -m supervisord_dependent_startup
8+
autostart=true
9+
autorestart=unexpected
10+
startretries=0
11+
exitcodes=0,3
12+
events=PROCESS_STATE
13+
buffer_size=1024
14+
15+
[eventlistener:supervisor-proc-exit-listener]
16+
command=/usr/bin/supervisor-proc-exit-listener --container-name eventd
17+
events=PROCESS_STATE_EXITED,PROCESS_STATE_RUNNING
18+
autostart=true
19+
autorestart=unexpected
20+
buffer_size=1024
21+
22+
[program:rsyslogd]
23+
command=/usr/sbin/rsyslogd -n -iNONE
24+
priority=1
25+
autostart=false
26+
autorestart=unexpected
27+
stdout_logfile=syslog
28+
stderr_logfile=syslog
29+
dependent_startup=true
30+
31+
[program:start]
32+
command=/usr/bin/start.sh
33+
priority=2
34+
autostart=false
35+
autorestart=false
36+
startsecs=0
37+
stdout_logfile=syslog
38+
stderr_logfile=syslog
39+
dependent_startup=true
40+
dependent_startup_wait_for=rsyslogd:running
41+
42+
43+
[program:eventd]
44+
command=/usr/sbin/eventd
45+
priority=3
46+
autostart=false
47+
autorestart=false
48+
stdout_logfile=syslog
49+
stderr_logfile=syslog
50+
dependent_startup=true
51+
dependent_startup_wait_for=start:exited
52+

dockers/docker-fpm-frr/Dockerfile.j2

+6
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,15 @@ COPY ["TSC", "/usr/bin/TSC"]
5555
COPY ["TS", "/usr/bin/TS"]
5656
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
5757
COPY ["zsocket.sh", "/usr/bin/"]
58+
COPY ["*.json", "/etc/rsyslog.d/"]
59+
COPY ["files/rsyslog_plugin.conf.j2", "/etc/rsyslog.d/"]
5860
RUN chmod a+x /usr/bin/TSA && \
5961
chmod a+x /usr/bin/TSB && \
6062
chmod a+x /usr/bin/TSC && \
6163
chmod a+x /usr/bin/zsocket.sh
6264

65+
RUN j2 -f json /etc/rsyslog.d/rsyslog_plugin.conf.j2 /etc/rsyslog.d/events_info.json > /etc/rsyslog.d/bgp_events.conf
66+
RUN rm -f /etc/rsyslog.d/rsyslog_plugin.conf.j2*
67+
RUN rm -f /etc/rsyslog.d/events_info.json*
68+
6369
ENTRYPOINT ["/usr/bin/docker_init.sh"]

dockers/docker-fpm-frr/bgp_regex.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
{
3+
"tag": "bgp-state",
4+
"regex": "Peer .default\\|([0-9a-f:.]*[0-9a-f]*). admin state is set to .(up|down).",
5+
"params": [ "ip", "status" ]
6+
}
7+
]
8+
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"yang_module": "sonic-events-bgp",
3+
"proclist": [
4+
{
5+
"name": "bgp",
6+
"parse_json": "bgp_regex.json"
7+
}
8+
]
9+
}
10+

files/build_templates/docker_image_ctl.j2

+1
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,7 @@ start() {
515515
{%- endif -%}
516516
{%- if docker_container_name == "bgp" %}
517517
-v /etc/sonic/frr/$DEV:/etc/frr:rw \
518+
-v /usr/share/sonic/scripts:/usr/share/sonic/scripts:ro \
518519
{%- endif %}
519520
{%- if docker_container_name == "database" %}
520521
$DB_OPT \
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[Unit]
2+
Description=EVENTD container
3+
Requires=updategraph.service
4+
After=updategraph.service
5+
BindsTo=sonic.target
6+
After=sonic.target
7+
StartLimitIntervalSec=1200
8+
StartLimitBurst=3
9+
10+
[Service]
11+
ExecStartPre=/usr/bin/{{docker_container_name}}.sh start
12+
ExecStart=/usr/bin/{{docker_container_name}}.sh wait
13+
ExecStop=/usr/bin/{{docker_container_name}}.sh stop
14+
RestartSec=30
15+
16+
[Install]
17+
WantedBy=sonic.target

files/build_templates/init_cfg.json.j2

+2-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
("pmon", "enabled", false, "enabled"),
4040
("radv", "enabled", false, "enabled"),
4141
("snmp", "enabled", true, "enabled"),
42+
("eventd", "enabled", true, "enabled"),
4243
("swss", "enabled", false, "enabled"),
4344
("syncd", "enabled", false, "enabled"),
4445
("teamd", "enabled", false, "enabled")] %}
@@ -69,7 +70,7 @@
6970
"check_up_status" : "false",
7071
{%- endif %}
7172
{%- if include_kubernetes == "y" %}
72-
{%- if feature in ["lldp", "pmon", "radv", "snmp", "telemetry"] %}
73+
{%- if feature in ["lldp", "pmon", "radv", "eventd", "snmp", "telemetry"] %}
7374
"set_owner": "kube", {% else %}
7475
"set_owner": "local", {% endif %} {% endif %}
7576
"high_mem_alert": "disabled"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
## rsyslog-plugin for streaming telemetry via gnmi
2+
3+
4+
5+
template(name="prog_msg" type="list") {
6+
property(name="msg")
7+
constant(value="\n")
8+
}
9+
10+
$ModLoad omprog
11+
12+
{% for proc in proclist %}
13+
if re_match($programname, "{{ proc.name }}") then {
14+
action(type="omprog"
15+
binary="/usr/share/sonic/scripts/rsyslog_plugin -r /etc/rsyslog.d/{{ proc.parse_json }} -m {{ yang_module }}"
16+
output="/var/log/rsyslog_plugin.log"
17+
template="prog_msg")
18+
}
19+
{% endfor %}

files/build_templates/sonic_debian_extension.j2

+4
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,10 @@ sudo bash -c "echo { > $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/ctr_image_name
799799
{% endfor %}
800800
sudo bash -c "echo } >> $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/ctr_image_names.json"
801801

802+
# copy rsyslog plugin binary for use by all dockers that use plugin to publish events.
803+
sudo mkdir -p ${FILESYSTEM_ROOT_USR_SHARE_SONIC_SCRIPTS}
804+
sudo cp ${files_path}/rsyslog_plugin ${FILESYSTEM_ROOT_USR_SHARE_SONIC_SCRIPTS}/
805+
802806
{% for script in installer_start_scripts.split(' ') -%}
803807
if [ -f $TARGET_MACHINE"_{{script}}" ]; then
804808
sudo cp $TARGET_MACHINE"_{{script}}" $FILESYSTEM_ROOT/usr/bin/{{script}}

rules/docker-config-engine-bullseye.mk

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ $(DOCKER_CONFIG_ENGINE_BULLSEYE)_DEPENDS += $(LIBSWSSCOMMON) \
88
$(LIBYANG_CPP) \
99
$(LIBYANG_PY3) \
1010
$(PYTHON3_SWSSCOMMON) \
11-
$(SONIC_DB_CLI)
11+
$(SONIC_DB_CLI) \
12+
$(SONIC_EVENTD)
1213
$(DOCKER_CONFIG_ENGINE_BULLSEYE)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) \
1314
$(SONIC_YANG_MGMT_PY3) \
1415
$(SONIC_YANG_MODELS_PY3)
1516
$(DOCKER_CONFIG_ENGINE_BULLSEYE)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE_PY3)
1617
$(DOCKER_CONFIG_ENGINE_BULLSEYE)_LOAD_DOCKERS += $(DOCKER_BASE_BULLSEYE)
1718
$(DOCKER_CONFIG_ENGINE_BULLSEYE)_FILES += $(SWSS_VARS_TEMPLATE)
19+
$(DOCKER_CONFIG_ENGINE_BULLSEYE)_FILES += $(RSYSLOG_PLUGIN_CONF_J2)
1820
$(DOCKER_CONFIG_ENGINE_BULLSEYE)_FILES += $($(SONIC_CTRMGRD)_CONTAINER_SCRIPT)
1921

2022
$(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS = $($(DOCKER_BASE_BULLSEYE)_DBG_DEPENDS) \

rules/docker-config-engine-buster.mk

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ $(DOCKER_CONFIG_ENGINE_BUSTER)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) \
1515
$(DOCKER_CONFIG_ENGINE_BUSTER)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE_PY3)
1616
$(DOCKER_CONFIG_ENGINE_BUSTER)_LOAD_DOCKERS += $(DOCKER_BASE_BUSTER)
1717
$(DOCKER_CONFIG_ENGINE_BUSTER)_FILES += $(SWSS_VARS_TEMPLATE)
18+
$(DOCKER_CONFIG_ENGINE_BUSTER)_FILES += $(RSYSLOG_PLUGIN_CONF_J2)
1819
$(DOCKER_CONFIG_ENGINE_BUSTER)_FILES += $($(SONIC_CTRMGRD)_CONTAINER_SCRIPT)
1920

2021
$(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS = $($(DOCKER_BASE_BUSTER)_DBG_DEPENDS) \

rules/docker-eventd.dep

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
DPATH := $($(DOCKER_EVENTD)_PATH)
3+
DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/docker-eventd.mk rules/docker-eventd.dep
4+
DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST)
5+
DEP_FILES += $(shell git ls-files $(DPATH))
6+
7+
$(DOCKER_EVENTD)_CACHE_MODE := GIT_CONTENT_SHA
8+
$(DOCKER_EVENTD)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST)
9+
$(DOCKER_EVENTD)_DEP_FILES := $(DEP_FILES)
10+
11+
$(eval $(call add_dbg_docker,$(DOCKER_EVENTD),$(DOCKER_EVENTD_DBG)))

rules/docker-eventd.mk

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# docker image for eventd
2+
3+
DOCKER_EVENTD_STEM = docker-eventd
4+
DOCKER_EVENTD = $(DOCKER_EVENTD_STEM).gz
5+
DOCKER_EVENTD_DBG = $(DOCKER_EVENTD_STEM)-$(DBG_IMAGE_MARK).gz
6+
7+
$(DOCKER_EVENTD)_DEPENDS += $(SONIC_EVENTD)
8+
9+
$(DOCKER_EVENTD)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS)
10+
$(DOCKER_EVENTD)_DBG_DEPENDS += $(SONIC_EVENTD_DBG) $(LIBSWSSCOMMON_DBG)
11+
12+
$(DOCKER_EVENTD)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES)
13+
14+
$(DOCKER_EVENTD)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BULLSEYE)
15+
16+
$(DOCKER_EVENTD)_PATH = $(DOCKERS_PATH)/$(DOCKER_EVENTD_STEM)
17+
18+
$(DOCKER_EVENTD)_INSTALL_PYTHON_WHEELS = $(SONIC_UTILITIES_PY3)
19+
$(DOCKER_EVENTD)_INSTALL_DEBS = $(PYTHON3_SWSSCOMMON)
20+
21+
$(DOCKER_EVENTD)_VERSION = 1.0.0
22+
$(DOCKER_EVENTD)_PACKAGE_NAME = eventd
23+
24+
$(DOCKER_DHCP)_SERVICE_REQUIRES = updategraph
25+
$(DOCKER_DHCP)_SERVICE_AFTER = database
26+
27+
SONIC_DOCKER_IMAGES += $(DOCKER_EVENTD)
28+
SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_EVENTD)
29+
30+
SONIC_DOCKER_DBG_IMAGES += $(DOCKER_EVENTD_DBG)
31+
SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_EVENTD_DBG)
32+
33+
$(DOCKER_EVENTD)_CONTAINER_NAME = eventd
34+
$(DOCKER_EVENTD)_RUN_OPT += --privileged -t
35+
$(DOCKER_EVENTD)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro
36+
37+
SONIC_BULLSEYE_DOCKERS += $(DOCKER_EVENTD)
38+
SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_EVENTD_DBG)
39+
40+
$(DOCKER_EVENTD)_FILESPATH = $($(SONIC_EVENTD)_SRC_PATH)/rsyslog_plugin
41+
42+
$(DOCKER_EVENTD)_PLUGIN = rsyslog_plugin
43+
$($(DOCKER_EVENTD)_PLUGIN)_PATH = $($(DOCKER_EVENTD)_FILESPATH)
44+
45+
SONIC_COPY_FILES += $($(DOCKER_EVENTD)_PLUGIN)
46+
$(DOCKER_EVENTD)_SHARED_FILES = $($(DOCKER_EVENTD)_PLUGIN)
47+

rules/eventd.dep

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
SPATH := $($(SONIC_EVENTD)_SRC_PATH)
3+
DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/eventd.mk rules/eventd.dep
4+
DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST)
5+
DEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files))
6+
7+
$(SONIC_EVENTD)_CACHE_MODE := GIT_CONTENT_SHA
8+
$(SONIC_EVENTD)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST)
9+
$(SONIC_EVENTD)_DEP_FILES := $(DEP_FILES)
10+

rules/eventd.mk

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# eventd package
2+
3+
SONIC_EVENTD_VERSION = 1.0.0-0
4+
SONIC_EVENTD_PKG_NAME = eventd
5+
6+
SONIC_EVENTD = sonic-$(SONIC_EVENTD_PKG_NAME)_$(SONIC_EVENTD_VERSION)_$(CONFIGURED_ARCH).deb
7+
$(SONIC_EVENTD)_SRC_PATH = $(SRC_PATH)/sonic-eventd
8+
$(SONIC_EVENTD)_DEPENDS += $(LIBSWSSCOMMON) $(LIBSWSSCOMMON_DEV)
9+
10+
SONIC_DPKG_DEBS += $(SONIC_EVENTD)
11+
12+
SONIC_EVENTD_DBG = sonic-$(SONIC_EVENTD_PKG_NAME)-dbgsym_$(SONIC_EVENTD_VERSION)_$(CONFIGURED_ARCH).deb
13+
$(eval $(call add_derived_package,$(SONIC_EVENTD),$(SONIC_EVENTD_DBG)))
14+
15+
# The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list}
16+
# are archived into debug one image to facilitate debugging.
17+
#
18+
DBG_SRC_ARCHIVE += sonic-eventd
19+

rules/scripts.mk

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ $(SWSS_VARS_TEMPLATE)_PATH = files/build_templates
3232
COPP_CONFIG_TEMPLATE = copp_cfg.j2
3333
$(COPP_CONFIG_TEMPLATE)_PATH = files/image_config/copp
3434

35+
RSYSLOG_PLUGIN_CONF_J2 = rsyslog_plugin.conf.j2
36+
$(RSYSLOG_PLUGIN_CONF_J2)_PATH = files/build_templates
37+
3538
SONIC_COPY_FILES += $(CONFIGDB_LOAD_SCRIPT) \
3639
$(ARP_UPDATE_SCRIPT) \
3740
$(ARP_UPDATE_VARS_TEMPLATE) \
@@ -42,4 +45,5 @@ SONIC_COPY_FILES += $(CONFIGDB_LOAD_SCRIPT) \
4245
$(SYSCTL_NET_CONFIG) \
4346
$(UPDATE_CHASSISDB_CONFIG_SCRIPT) \
4447
$(SWSS_VARS_TEMPLATE) \
48+
$(RSYSLOG_PLUGIN_CONF_J2) \
4549
$(COPP_CONFIG_TEMPLATE)

rules/telemetry.mk

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
SONIC_TELEMETRY = sonic-gnmi_0.1_$(CONFIGURED_ARCH).deb
44
$(SONIC_TELEMETRY)_SRC_PATH = $(SRC_PATH)/sonic-gnmi
5-
$(SONIC_TELEMETRY)_DEPENDS = $(SONIC_MGMT_COMMON) $(SONIC_MGMT_COMMON_CODEGEN)
6-
$(SONIC_TELEMETRY)_RDEPENDS =
5+
$(SONIC_TELEMETRY)_DEPENDS = $(SONIC_MGMT_COMMON) $(SONIC_MGMT_COMMON_CODEGEN) \
6+
$(LIBSWSSCOMMON_DEV) $(LIBSWSSCOMMON)
7+
$(SONIC_TELEMETRY)_RDEPENDS = $(LIBSWSSCOMMON) $(LIBSWSSCOMMON_DEV)
78
SONIC_DPKG_DEBS += $(SONIC_TELEMETRY)

slave.mk

+2
Original file line numberDiff line numberDiff line change
@@ -1292,6 +1292,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \
12921292
$(if $($(docker:-dbg.gz=.gz)_MACHINE),\
12931293
mv $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).sh $($(docker:-dbg.gz=.gz)_MACHINE)_$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).sh
12941294
)
1295+
$(foreach file, $($(docker)_SHARED_FILES), \
1296+
{ cp $($(file)_PATH)/$(file) $(FILES_PATH)/ $(LOG) || exit 1 ; } ; )
12951297
)
12961298

12971299
# Exported variables are used by sonic_debian_extension.sh

0 commit comments

Comments
 (0)