diff --git a/Makefile b/Makefile index f280cfbb22..7ba6bf2aa1 100644 --- a/Makefile +++ b/Makefile @@ -117,12 +117,14 @@ update_fixtures: .PHONY: tools tools: @rm ./tools/tools >/dev/null 2>&1 || true - @$(GO) build -o tools ./tools/... + @$(GO) build -o tools/tools ./tools/... .PHONY: test-e2e test-e2e: build collector/fixtures/sys/.unpacked collector/fixtures/udev/.unpacked tools @echo ">> running end-to-end tests" ./end-to-end-test.sh -e "$(E2E_EXTRA_FLAGS)" + @echo ">> running end-to-end tests with unix socket" + ./end-to-end-test.sh -e "$(E2E_EXTRA_FLAGS)" -s .PHONY: skip-test-e2e skip-test-e2e: diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000000..6b39cb5d4c --- /dev/null +++ b/debian/changelog @@ -0,0 +1,13 @@ +cl-node-exporter (1.2.0-1) stable; urgency=medium + + [ Ruslan Koliada ] + * CLPRO-2902: Sync node_exporter with upstream + + -- Ruslan Koliada Mon, 1 Dec 2025 10:00:00 +0000 + +cl-node-exporter (1.1.0-3) stable; urgency=medium + + [ Yehor Komarov ] + * CLPRO-2539: Added support for Ubuntu 22 + + -- Yehor Komarov Wed, 8 Jan 2024 10:00:00 +0000 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000000..f11c82a4cb --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +9 \ No newline at end of file diff --git a/debian/control b/debian/control new file mode 100644 index 0000000000..abe98e8e09 --- /dev/null +++ b/debian/control @@ -0,0 +1,18 @@ +Source: cl-node-exporter +Section: admin +Priority: optional +Maintainer: CloudLinux Packaging Team +Build-Depends: debhelper (>= 9), + curl +Standards-Version: 4.5.1 +Homepage: https://www.cloudlinux.com + +Package: cl-node-exporter +Architecture: amd64 +Description: CL Node Exporter tool + This package provides Node Exporter tool. + +Package: cl-node-exporter-tests +Architecture: amd64 +Description: Tests for CL Node Exporter + This package provides end-to-end tests for Node Exporter tool diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000000..514201b394 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,146 @@ +CLOUD LINUX LICENSE AGREEMENT + +READ THIS LICENSE AGREEMENT BEFORE INSTALLING THESE PROGRAMS. THIS +LICENSE AGREEMENT IS A LEGAL CONTRACT BETWEEN YOU AND CLOUD LINUX, INC. +("CLOUD LINUX") GOVERNING YOUR USE OF ANY PROGRAMS DOWNLOADED, INSTALLED +OR USED BY YOU (THE “PROGRAMS”). CLOUD LINUX IS UNWILLING TO LICENSE +THE PROGRAMS EXCEPT ON THE TERMS CONTAINED IN THIS LICENSE AGREEMENT. +THE ACT OF DOWNLOADING, INSTALLING OR USING THE PROGRAMS SHALL +CONSTITUTE AN ACCEPTANCE BY YOU OF THE TERMS OF THIS LICENSE AGREEMENT. +IF YOU DO NOT WISH TO AGREE TO THE TERMS OF THIS LICENSE AGREEMENT, +PROMPTLY EXIT THE INSTALLATION NOW AND REMOVE IT FROM YOUR SYSTEM. + +THIS LICENSE AGREEMENT IS THE COMPLETE AND EXCLUSIVE STATEMENT OF CLOUD +LINUX'S OBLIGATIONS AND RESPONSIBILITIES TO YOU AS LICENSEE, AND +SUPERSEDES ANY OTHER PROPOSAL, REPRESENTATION, OR OTHER COMMUNICATION BY +OR ON BEHALF OF CLOUD LINUX RELATING TO THE SUBJECT. + + 1. GRANT OF LICENSE. Cloud Linux hereby grants to you, and you +accept, a limited, nonexclusive license to use the Programs in +machine-readable, object code form only, and the user manuals +accompanying the Programs (the “Documentation”), only as authorized +in this Agreement. For purposes of this Agreement, the “Programs” +include any updates, enhancements, modifications, revisions, or +additions to the Programs made by Cloud Linux and made available to +end-users. Notwithstanding the foregoing, Cloud Linux shall be under no +obligation to provide any updates, enhancements, modifications, +revisions, or additions to the Programs. + + You may use one copy of the Programs only on systems, including +servers, work stations, virtual machines, blades, nodes or disk +partitions, for which you have purchased Subscription Services from +Cloud Linux or its resellers. For purposes of this Agreement, “use” +of the Programs means loading the Programs into the temporary or +permanent memory of a computer. Installation of the Programs on a +network server solely for distribution to other computers is not +“use” of the Programs, and is permitted, as long as you have +purchased Subscription Services for the systems being accessed by the +Programs. + + 2. PROTECTION OF PROPRIETARY RIGHTS. You acknowledge that the +Programs and each of their components are owned by Cloud Linux and +others, and are protected under copyright law and other laws as +applicable. Title to the Programs, or to any copy, modification, or +merged portion thereof shall remain with their respective owners, +subject to the applicable license. You may commercially redistribute +the Programs only if, you have entered into a separate agreement with +Cloud Linux authorizing such commercial redistribution or Cloud Linux +has otherwise granted you permission, in writing. + + You agree not to remove any confidential or proprietary legends from +the Programs. + + You acknowledge that, in the event of your breach of any of the +foregoing provisions, Cloud Linux will not have an adequate remedy in +money or damages. Cloud Linux shall therefore be entitled to obtain an +injunction against such breach from any court of competent jurisdiction +immediately upon request. Cloud Linux's right to obtain injunctive +relief shall not limit its right to seek further remedies. + + Your obligations hereunder shall remain in effect for as long as you +continue to possess or use the Programs, or any proprietary interests +therein. + + 3. LIMITED WARRANTY; EXCLUSIVE REMEDIES. + + Limited Warranty: Cloud Linux warrants that (i) the media on which +the Programs are furnished will be free from defects in materials and +manufacture under normal use of a period of 30 days from the date of +delivery to you; and (ii) Cloud Linux is the owner or authorized +licensee of the Programs, or has the rights to license the Programs to +you. + + No person other than Cloud Linux, in writing, is authorized to +make any representation or warranty to you regarding the +Programs. + + Exclusive Remedy: In the event of a breach of the limited +warranty above, your exclusive remedy relative to the Programs shall be +for Cloud Linux, at Cloud Linux’s option, to either: (i) replace the +Programs that does not meet the limited warranty; or (ii) refund to you +the Programs license fees (and no other fees) paid by you, during the 12 +month period immediately preceding the breach of the limited warranty, +for the Programs which fails to comply with the limited warranties. + + 4. DISCLAIMER; LIMITATION ON LIABILITY + + Disclaimer: THE LIMITED WARRANTY ABOVE IS THE SOLE WARRANTY MADE BY +CLOUD LINUX. CLOUD LINUX MAKES NO OTHER WARRANTY OF ANY KIND +WHATSOEVER, EXPRESS OR IMPLIED. ANY AND ALL WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +ARE EXPRESSLY DISCLAIMED AND EXCLUDED BY CLOUD LINUX. + + Limitation on Consequential Damages: IN NO EVENT SHALL CLOUD +LINUX BE LIABLE TO YOU, AS LICENSEE, OR ANY OTHER PERSON FOR ANY +INDIRECT, CONSEQUENTIAL OR INCIDENTAL DAMAGES (INCLUDING DAMAGES FOR +BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION OR +SIMILAR LOSSES) EVEN IF CLOUD LINUX HAS BEEN ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + + Limitation on Liability: THE CUMULATIVE LIABILITY OF CLOUD +LINUX TO YOU FOR ALL CLAIMS RELATED TO THE PROGRAMS AND THIS LICENSE +AGREEMENT, INCLUDING ANY CAUSE OF ACTION SOUNDING IN CONTRACT, TORT, OR +STRICT LIABILITY SHALL NOT EXCEED THE TOTAL AMOUNT OF ALL LICENSE FEES +(AND NO OTHER FEES) PAID TO CLOUD LINUX FOR THE PROGRAMS DURING THE +TWELVE (12) MONTH PERIOD IMMEDIATELY PRECEDING THE INITIAL EVENT GIVING +RISE TO THE CLAIM. + + All limitations on liability, damages and claims are intended to +apply without regard to whether other provisions of this License +Agreement have been breached or have proven ineffective. + + 5. TERMINATION. The license granted herein is effective +until terminated. The license will automatically terminate, without +notice, if you fail to comply with any provision of this License +Agreement. Upon termination of this License Agreement, all rights +granted to you pursuant to this License Agreement will terminate and +revert to Cloud Linux. + + 6. EXPORT CONTROL. You agree to comply with all applicable +laws, regulations, rulings and executive orders of the United States +relating to the exportation or importation of any copies of the Programs +(including but not limited to the export and destination control +regulations of the Commerce and Treasury Department) and with all +applicable foreign laws relating to the use, importation, licensing or +distribution of copies of the Programs. + + 7. GENERAL. This License Agreement shall be governed by +and construed in accordance with the laws of the State of Delaware and +the United States, without regard to any conflict of laws provisions. +The rights and obligations of the parties to this License Agreement +shall not be governed by the United Nations Convention on the +International Sale of Goods. + + No modification of this License Agreement shall be binding +unless it is in writing and is signed by an authorized representative of +the party against whom enforcement of the modification is sought. + + Any notices required or permitted under this License Agreement +shall be in writing and delivered in person or sent by registered or +certified mail, return receipt requested, with proper postage affixed. + + In the event that any term of this License Agreement is or +becomes or is declared to be invalid or void by any court or tribunal of +competent jurisdiction, such term shall be null and void and shall be +deemed severed from this License Agreement, and all the remaining terms +of this License Agreement shall remain in full force and effect. diff --git a/debian/rules b/debian/rules new file mode 100644 index 0000000000..0a0ea703d4 --- /dev/null +++ b/debian/rules @@ -0,0 +1,77 @@ +#!/usr/bin/make -f +#-*- makefile -*- + +export DH_VERBOSE=1 +export SHELL := /bin/bash + +GOROOT = /tmp/go +PATH = $(GOROOT)/bin:$(shell printenv PATH) +DPKG_VARS := $(shell dpkg-architecture) +DEB_BUILD_MULTIARCH ?= $(call vafilt,$(DPKG_VARS),DEB_BUILD_MULTIARCH) +DEB_HOST_MULTIARCH ?= $(call vafilt,$(DPKG_VARS),DEB_HOST_MULTIARCH) + +with_ea4 := 1 +with_plesk := 1 +with_checks := 0 + +srcname := cl-node-exporter +name := $(srcname) +version := $(shell dpkg-parsechangelog -SVersion | sed -rne 's/([0-9.]+)-([0-9]+)\.?.*/\1/p') +release := $(shell dpkg-parsechangelog -SVersion | sed -rne 's/([0-9.]+)-([0-9]+)\.?.*/\2/p').ubuntu.cloudlinux +_sourcedir := debian/source +buildroot := $(CURDIR)/debian/tmp +_sysconfdir := /etc +_sbindir := /usr/sbin +_unitdir := /usr/lib/systemd/system +_clshare_plus := /usr/share/cloudlinux/cl_plus + +%: + dh $@ + +override_dh_auto_build: + curl https://dl.google.com/go/go1.24.0.linux-amd64.tar.gz --output /tmp/go.tar.gz + tar xzf /tmp/go.tar.gz -C /tmp/ + make build + make tools + make test + rm -rf collector/fixtures/sys + ./ttar -C collector/fixtures -x -f collector/fixtures/sys.ttar + +override_dh_auto_install: + rm -rf $(buildroot) + mkdir -p $(buildroot)$(_clshare_plus)/ + + install -D -m 755 node_exporter $(buildroot)$(_clshare_plus)/node_exporter + + # Install tests + mkdir -p $(buildroot)/opt/node_exporter_tests/ + cp -r collector $(buildroot)/opt/node_exporter_tests/ + install -D -m 755 end-to-end-test.sh $(buildroot)/opt/node_exporter_tests/end-to-end-test.sh + install -D -m 755 node_exporter $(buildroot)/opt/node_exporter_tests/node_exporter + mkdir -p $(buildroot)/opt/node_exporter_tests/tools + install -D -m 755 tools/tools $(buildroot)/opt/node_exporter_tests/tools/tools + + # remove broken symlinks + find $(buildroot)/opt/node_exporter_tests/collector/fixtures -xtype l -delete + + echo "$(version)-$(release)" > $(buildroot)/usr/share/cloudlinux/cl_version + + # Packaging + dh_movefiles -p$(name) \ + .$(_clshare_plus)/node_exporter + + dh_movefiles -p$(name)-tests \ + ./opt/node_exporter_tests/collector/ \ + ./opt/node_exporter_tests/end-to-end-test.sh \ + ./opt/node_exporter_tests/node_exporter \ + ./opt/node_exporter_tests/tools/ + + dh_installdirs -p$(name) \ + .$(_clshare_plus) + + dh_installdirs -p$(name)-tests \ + ./opt/node_exporter_tests/ + exit 0 + +override_dh_auto_clean: + rm -rf $(buildroot) diff --git a/end-to-end-test.sh b/end-to-end-test.sh index de490bfff8..c343579508 100755 --- a/end-to-end-test.sh +++ b/end-to-end-test.sh @@ -3,7 +3,7 @@ set -euf -o pipefail # Allow setting GOHOSTOS for debugging purposes. -GOHOSTOS=${GOHOSTOS:-$(go env GOHOSTOS)} +GOHOSTOS=${GOHOSTOS:-$(go env GOHOSTOS 2>/dev/null || uname -s | tr '[:upper:]' '[:lower:]')} # Allow setting arch for debugging purposes. arch=${arch:-$(uname -m)} @@ -105,6 +105,7 @@ cd "$(dirname $0)" port="$((10000 + (RANDOM % 10000)))" tmpdir=$(mktemp -d /tmp/node_exporter_e2e_test.XXXXXX) +unix_socket="${tmpdir}/node_exporter.socket" skip_re="^(go_|node_exporter_build_info|node_scrape_collector_duration_seconds|process_|node_textfile_mtime_seconds|node_time_(zone|seconds)|node_network_(receive|transmit)_(bytes|packets)_total)" @@ -127,8 +128,8 @@ case "${arch}" in ;; esac -extra_flags=""; keep=0; update=0; verbose=0 -while getopts 'e:hkuv' opt +extra_flags=""; keep=0; update=0; verbose=0; socket=0 +while getopts 'e:hkuvs' opt do case "$opt" in e) @@ -140,15 +141,19 @@ do u) update=1 ;; + s) + socket=1 + ;; v) verbose=1 set -x ;; *) - echo "Usage: $0 [-k] [-u] [-v]" + echo "Usage: $0 [-k] [-u] [-v] [-s]" echo " -k: keep temporary files and leave node_exporter running" echo " -u: update fixture_metrics" echo " -v: verbose output" + echo " -s: use unix socket" exit 1 ;; esac @@ -248,17 +253,26 @@ for flag in ${collector_flags}; do fi done -echo "ENABLED COLLECTORS=======" -echo "${supported_enabled_collectors:1}" | tr ' ' '\n' | sort -echo "=========================" +cat << EOF > "${tmpdir}/config.log" +ENABLED COLLECTORS======= +$(echo "${supported_enabled_collectors:1}" | tr ' ' '\n' | sort) +========================= + +DISABLED COLLECTORS====== +$(echo "${supported_disabled_collectors:1}" | tr ' ' '\n' | sort) +========================= -echo "DISABLED COLLECTORS======" -echo "${supported_disabled_collectors:1}" | tr ' ' '\n' | sort -echo "=========================" +IGNORED FLAGS============ +$(echo "${ignored_flags:1}"| tr ' ' '\n' | sort | uniq) +========================= +EOF -echo "IGNORED FLAGS============" -echo "${ignored_flags:1}"| tr ' ' '\n' | sort | uniq -echo "=========================" +if [ ${socket} -ne 0 ]; then + touch "${unix_socket}" + connection_params="--web.socket-path=${unix_socket}" +else + connection_params="--web.listen-address=127.0.0.1:${port}" +fi ./node_exporter \ --path.rootfs="collector/fixtures" \ @@ -268,7 +282,7 @@ echo "=========================" $(for c in ${supported_enabled_collectors}; do echo --collector.${c} ; done) \ $(for c in ${supported_disabled_collectors}; do echo --no-collector.${c} ; done) \ ${filtered_collector_flags} \ - --web.listen-address "127.0.0.1:${port}" \ + ${connection_params} \ --log.level="debug" > "${tmpdir}/node_exporter.log" 2>&1 & echo $! > "${tmpdir}/node_exporter.pid" @@ -285,6 +299,9 @@ finish() { if [ $? -ne 0 -o ${verbose} -ne 0 ] then cat << EOF >&2 +CONFIG ================== +$(cat "${tmpdir}/config.log") +========================= LOG ===================== $(cat "${tmpdir}/node_exporter.log") ========================= @@ -298,11 +315,31 @@ EOF if [ ${keep} -eq 0 ] then - kill -9 "$(cat ${tmpdir}/node_exporter.pid)" - # This silences the "Killed" message - set +e - wait "$(cat ${tmpdir}/node_exporter.pid)" > /dev/null 2>&1 + pid=$(cat "${tmpdir}/node_exporter.pid") + # Disown to prevent shell from printing "Terminated" message + disown "$pid" 2>/dev/null || true + kill "$pid" 2>/dev/null || true + # Wait for the process to exit gracefully to allow socket cleanup + for i in {1..100}; do + if ! kill -0 "$pid" 2>/dev/null; then + break + fi + sleep 0.1 + done + # Force kill if it's still running + kill -9 "$pid" 2>/dev/null || true + + rc=0 + if [ ${socket} -ne 0 ]; then + if ls -l "${unix_socket}" &> /dev/null; then + echo "Node exporter didn't remove the socket file after it exiting" + rc=1 + fi + fi rm -rf "${tmpdir}" + if [ $rc -ne 0 ]; then + exit $rc + fi fi } @@ -323,7 +360,13 @@ get() { sleep 1 -get "127.0.0.1:${port}/metrics" | grep --text -E -v "${skip_re}" > "${generated_metrics}" +( + if [ ${socket} -ne 0 ]; then + curl -s -X GET --unix-socket "${unix_socket}" http://localhost/metrics + else + get "127.0.0.1:${port}/metrics" + fi +) | grep --text -E -v "${skip_re}" > "${generated_metrics}" # The following ignore-list is only applicable to the VMs used to run E2E tests on platforms for which containerized environments are not available. # However, owing to this, there are some non-deterministic metrics that end up generating samples, unlike their containerized counterparts, for e.g., node_network_receive_bytes_total. diff --git a/node_exporter.go b/node_exporter.go index 2c0e12ccc1..b4064b9460 100644 --- a/node_exporter.go +++ b/node_exporter.go @@ -16,13 +16,16 @@ package main import ( "fmt" "log/slog" + "net" "net/http" _ "net/http/pprof" "os" + "os/signal" "os/user" "runtime" "slices" "sort" + "syscall" "github.com/prometheus/common/promslog" "github.com/prometheus/common/promslog/flag" @@ -181,6 +184,14 @@ func (h *handler) innerHandler(filters ...string) (http.Handler, error) { func main() { var ( + socketPath = kingpin.Flag( + "web.socket-path", + "Path to a unix socket file on which to expose metrics and web interface.", + ).String() + socketPermissions = kingpin.Flag( + "web.socket-permissions", + "Permissions of unix socket file.", + ).Default("0640").Int32() metricsPath = kingpin.Flag( "web.telemetry-path", "Path under which to expose metrics.", @@ -244,8 +255,39 @@ func main() { } server := &http.Server{} - if err := web.ListenAndServe(server, toolkitFlags, logger); err != nil { - logger.Error(err.Error()) - os.Exit(1) + if *socketPath != "" { + os.Remove(*socketPath) + unixListener, err := net.Listen("unix", *socketPath) + if err != nil { + logger.Error("Error listening on socket", "err", err) + os.Exit(1) + } + if err := os.Chmod(*socketPath, os.FileMode(*socketPermissions)); err != nil { + logger.Error("Error changing socket permissions", "err", err) + os.Remove(*socketPath) + os.Exit(1) + } + defer os.Remove(*socketPath) + + go func() { + if err := server.Serve(unixListener); err != nil && err != http.ErrServerClosed { + logger.Error("Error serving", "err", err) + os.Exit(1) + } + }() + + done := make(chan os.Signal, 1) + signal.Notify(done, syscall.SIGINT, syscall.SIGTERM) + logger.Info("Listening on", "path", *socketPath) + <-done + logger.Info("Connection closed on", "path", *socketPath) + server.Close() + os.Remove(*socketPath) + os.Exit(0) + } else { + if err := web.ListenAndServe(server, toolkitFlags, logger); err != nil { + logger.Error(err.Error()) + os.Exit(1) + } } } diff --git a/node_exporter.spec b/node_exporter.spec new file mode 100644 index 0000000000..9241aadd47 --- /dev/null +++ b/node_exporter.spec @@ -0,0 +1,107 @@ +Autoreq: 0 +%define cl_dir /usr/share/cloudlinux/ +%define _clshare_plus %{cl_dir}cl_plus +%define pkg_version_file %{cl_dir}%{name} + +Name: cl-node-exporter +Version: 1.2.0 +Release: 1%{dist}.cloudlinux +Summary: CL Node Exporter tool +License: Apache License, Version 2.0 +Group: System Environment/Base +Source0: %{name}-%{version}.tar.bz2 +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot + + +# Disable the building of the debug package(s). +%define debug_package %{nil} + + +%package tests +Summary: Tests for CL Node Exporter version %{version} +AutoReq: 0 +Group: Applications/System +License: Apache License, Version 2.0 + + +%description +This package provides Node Exporter tool + +%description tests +This package provides end-to-end tests for Node Exporter tool + + +%prep +%setup -q + + +%build +# download new version of Go compiler +%ifarch x86_64 amd64 ia32e +curl https://dl.google.com/go/go1.24.0.linux-amd64.tar.gz --output %{_tmppath}/go.tar.gz +%else +curl https://dl.google.com/go/go1.24.0.linux-386.tar.gz --output %{_tmppath}/go.tar.gz +%endif +tar xzf %{_tmppath}/go.tar.gz -C %{_tmppath} +export PATH=$PATH:%{_tmppath}/go/bin +export GOROOT=%{_tmppath}/go +export GOPATH=%{_tmppath} +make build +make tools +make test +# run cross-testing +%ifarch x86_64 amd64 ia32e +make test-32bit +%endif + +# build tests +rm -rf collector/fixtures/sys +./ttar -C collector/fixtures -x -f collector/fixtures/sys.ttar + + +%install +rm -rf $RPM_BUILD_ROOT + +install -D -m 755 node_exporter $RPM_BUILD_ROOT%{_clshare_plus}/node_exporter + +#install tests +mkdir -p $RPM_BUILD_ROOT/opt/node_exporter_tests/ +cp -r collector $RPM_BUILD_ROOT/opt/node_exporter_tests/ +install -D -m 755 end-to-end-test.sh $RPM_BUILD_ROOT/opt/node_exporter_tests/end-to-end-test.sh +install -D -m 755 node_exporter $RPM_BUILD_ROOT/opt/node_exporter_tests/node_exporter +mkdir -p $RPM_BUILD_ROOT/opt/node_exporter_tests/tools +install -D -m 755 tools/tools $RPM_BUILD_ROOT/opt/node_exporter_tests/tools/tools + +# remove broken symlinks +find $RPM_BUILD_ROOT/opt/node_exporter_tests/collector/fixtures -xtype l -delete + +# write package version to file +if [[ ! -d "$RPM_BUILD_ROOT%{cl_dir}" ]]; then + mkdir -p $RPM_BUILD_ROOT%{cl_dir} +fi +echo "%{version}-%{release}" > $RPM_BUILD_ROOT%{pkg_version_file} + +exit 0 + + +%files +%{_clshare_plus}/node_exporter +%{pkg_version_file} + +%files tests +/opt/node_exporter_tests/* + + +%changelog + +* Mon Dec 01 2025 Ruslan Koliada 1.2.0-1 +- CLPRO-2902: Sync repository with upstream + +* Wed Aug 19 2020 Stepan Oksanichenko 1.1.0-2 +- CMT-221: Add package versions tags to sentry + +* Fri Jun 26 2020 Stepan Oksanichenko 1.1.0-1 +- CMT-75: Added ability to use unix socket instead http connection + +* Mon Jun 03 2020 Stepan Oksanichenko 1.0.1-1 +- CMT-18: [End Server tools] Build node exporter from sources in cloudlinux