{ bash, bison, buildGoModule, cargo, cmake, corrosion, cups, curl, dlib, fetchFromGitHub, fetchzip, flex, freeipmi, go, jemalloc, json_c, lib, libbacktrace, libbpf, libcap, libelf, libmnl, libnetfilter_acct, libossp_uuid, libuuid, libuv, libyaml, lz4, makeWrapper, ninja, nixosTests, openssl, pkg-config, protobuf, replaceVars, rustc, rustPlatform, snappy, sqlite, stdenv, symlinkJoin, systemd, zlib, withCloudUi ? false, withConnPrometheus ? false, withCups ? false, withDBengine ? true, withDebug ? false, withEbpf ? false, withIpmi ? stdenv.hostPlatform.isLinux, withLibbacktrace ? true, withML ? true, withNdMcp ? true, withNdsudo ? false, withNetfilter ? stdenv.hostPlatform.isLinux, withNetflow ? stdenv.hostPlatform.isLinux, withNetworkViewer ? true, withOtel ? stdenv.hostPlatform.isLinux, withSsl ? true, withSystemdJournal ? stdenv.hostPlatform.isLinux, withSystemdUnits ? stdenv.hostPlatform.isLinux, }: stdenv.mkDerivation ( finalAttrs: { pname = "netdata"; version = "2.11.0"; src = fetchFromGitHub { owner = "netdata"; repo = "netdata"; rev = "v${finalAttrs.version}"; hash = "sha256-ANXncPtAo3qkhqmOWEQ4wY8oAT5tWvIRS7QVxoT/cMs="; fetchSubmodules = true; }; strictDeps = true; nativeBuildInputs = [ bison cmake flex go makeWrapper ninja pkg-config ] ++ lib.optionals withCups [ cups.dev ] ++ lib.optionals (withNetflow || withOtel || withSystemdJournal) [ cargo corrosion rustc rustPlatform.cargoSetupHook ]; # bash is only used to rewrite shebangs buildInputs = [ bash curl jemalloc json_c libuv libyaml lz4 protobuf zlib ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ libossp_uuid ] ++ lib.optionals stdenv.hostPlatform.isLinux [ libcap libuuid ] ++ lib.optionals withConnPrometheus [ snappy ] ++ lib.optionals withCups [ cups ] ++ lib.optionals withEbpf [ libbpf libelf ] ++ lib.optionals withIpmi [ freeipmi ] ++ lib.optionals withLibbacktrace [ libbacktrace ] ++ lib.optionals withNetfilter [ libmnl libnetfilter_acct ] ++ lib.optionals withSsl [ openssl ] ++ lib.optionals (withSystemdJournal || withSystemdUnits) [ systemd ]; patches = [ # Allow ndsudo to use non-hardcoded `PATH` # See https://github.com/netdata/netdata/pull/17377#issuecomment-2183017868 # https://github.com/netdata/netdata/security/advisories/GHSA-pmhq-4cxq-wj93 ./ndsudo-fix-path.patch ./disable-binary-permission-check.patch ./use-local-corrosion.patch ./use-local-libbacktrace.patch ./use-local-sqlite.patch ] ++ lib.optional withCloudUi ( replaceVars ./dashboard-v3-add.patch { # FIXME web.archive.org link can be replace once https://github.com/netdata/netdata-cloud/issues/1081 resolved # last update 12/10/2025 21:25:17 dashboardPath = fetchzip { # The `if_` suffix is intentional, with out it the hash will vary depending on the region url = "https://web.archive.org/web/20251210212517if_/https://app.netdata.cloud/agent.tar.gz"; hash = "sha256-8ovYkvt324l6f0YT6wTG+Y2u7VaVqotAdssnNTtHIEk="; }; } ); # Guard against unused build-time development inputs in closure. Without # the ./skip-CONFIGURE_COMMAND.patch patch the closure retains inputs up # to bootstrap tools: # https://github.com/NixOS/nixpkgs/pull/175719 # We pick zlib.dev as a simple canary package with pkg-config input. disallowedReferences = lib.optional (!withDebug) zlib.dev; dontStrip = withDebug || withLibbacktrace; env.NIX_CFLAGS_COMPILE = lib.optionalString withDebug "-O1 -ggdb -DNETDATA_INTERNAL_CHECKS=1"; postInstall = '' # Relocate one folder above. mv $out/usr/* $out/ '' + lib.optionalString stdenv.hostPlatform.isLinux '' # rename this plugin so netdata will look for setuid wrapper mv $out/libexec/netdata/plugins.d/apps.plugin \ $out/libexec/netdata/plugins.d/apps.plugin.org mv $out/libexec/netdata/plugins.d/cgroup-network \ $out/libexec/netdata/plugins.d/cgroup-network.org mv $out/libexec/netdata/plugins.d/perf.plugin \ $out/libexec/netdata/plugins.d/perf.plugin.org mv $out/libexec/netdata/plugins.d/slabinfo.plugin \ $out/libexec/netdata/plugins.d/slabinfo.plugin.org mv $out/libexec/netdata/plugins.d/debugfs.plugin \ $out/libexec/netdata/plugins.d/debugfs.plugin.org # go.d.plugin derives its own module-config subdirectory name from its # own executable basename (trimming a trailing ".plugin", or mapping # the literal name "godplugin" to "go.d"), so it must keep one of # those two forms rather than the ".org" suffix used for other # wrapped plugins, or it will silently fail to find any module config. # https://github.com/netdata/netdata/blob/master/src/go/pkg/executable/executable.go mv $out/libexec/netdata/plugins.d/go.d.plugin \ $out/libexec/netdata/plugins.d/godplugin ${lib.optionalString withIpmi '' mv $out/libexec/netdata/plugins.d/freeipmi.plugin \ $out/libexec/netdata/plugins.d/freeipmi.plugin.org ''} ${lib.optionalString withNdsudo '' mv $out/libexec/netdata/plugins.d/ndsudo \ $out/libexec/netdata/plugins.d/ndsudo.org ln -s /var/lib/netdata/ndsudo/ndsudo $out/libexec/netdata/plugins.d/ndsudo ''} ${lib.optionalString withNetworkViewer '' mv $out/libexec/netdata/plugins.d/network-viewer.plugin \ $out/libexec/netdata/plugins.d/network-viewer.plugin.org ''} ${lib.optionalString withOtel '' mv $out/libexec/netdata/plugins.d/otel-plugin \ $out/libexec/netdata/plugins.d/otel-plugin.org ''} ${lib.optionalString withSystemdJournal '' mv $out/libexec/netdata/plugins.d/systemd-journal.plugin \ $out/libexec/netdata/plugins.d/systemd-journal.plugin.org ''} ${lib.optionalString withSystemdUnits '' mv $out/libexec/netdata/plugins.d/systemd-units.plugin \ $out/libexec/netdata/plugins.d/systemd-units.plugin.org ''} ''; preConfigure = '' ${lib.optionalString (withNetflow || withOtel || withSystemdJournal) '' export CMAKE_PREFIX_PATH="${corrosion}:$CMAKE_PREFIX_PATH" ''} export GOCACHE=$TMPDIR/go-cache export GOPATH=$TMPDIR/go export GOSUMDB=off substituteInPlace packaging/cmake/Modules/NetdataGoTools.cmake \ --replace-fail \ 'GOPROXY=https://proxy.golang.org' \ 'GOPROXY=${ lib.concatStringsSep "," ( [ "file://${finalAttrs.passthru.netdata-go-modules}" ] ++ lib.optional withNdMcp "file://${finalAttrs.passthru.nd-mcp}" ) }' # Prevent the path to be caught into the Nix store path. substituteInPlace CMakeLists.txt \ --replace-fail 'set(CACHE_DIR "''${NETDATA_RUNTIME_PREFIX}/var/cache/netdata")' 'set(CACHE_DIR "/var/cache/netdata")' \ --replace-fail 'set(CONFIG_DIR "''${NETDATA_RUNTIME_PREFIX}/etc/netdata")' 'set(CONFIG_DIR "/etc/netdata")' \ --replace-fail 'set(LIBCONFIG_DIR "''${NETDATA_RUNTIME_PREFIX}/usr/lib/netdata/conf.d")' 'set(LIBCONFIG_DIR "${placeholder "out"}/share/netdata/conf.d")' \ --replace-fail 'set(LOG_DIR "''${NETDATA_RUNTIME_PREFIX}/var/log/netdata")' 'set(LOG_DIR "/var/log/netdata")' \ --replace-fail 'set(PLUGINS_DIR "''${NETDATA_RUNTIME_PREFIX}/usr/libexec/netdata/plugins.d")' 'set(PLUGINS_DIR "${placeholder "out"}/libexec/netdata/plugins.d")' \ --replace-fail 'set(STOCK_DATA_DIR "''${NETDATA_RUNTIME_PREFIX}/''${STOCK_DATA_DEST}")' 'set(STOCK_DATA_DIR "${placeholder "out"}/share/netdata")' \ --replace-fail 'set(VARLIB_DIR "''${NETDATA_RUNTIME_PREFIX}/var/lib/netdata")' 'set(VARLIB_DIR "/var/lib/netdata")' \ --replace-fail 'set(pkglibexecdir_POST "''${NETDATA_RUNTIME_PREFIX}/usr/libexec/netdata")' 'set(pkglibexecdir_POST "${placeholder "out"}/libexec/netdata")' \ --replace-fail 'set(localstatedir_POST "''${NETDATA_RUNTIME_PREFIX}/var")' 'set(localstatedir_POST "/var")' \ --replace-fail 'set(BINDIR usr/sbin)' 'set(BINDIR "bin")' \ --replace-fail 'set(BUILD_INFO_CMAKE_CACHE_ARCHIVE_PATH "usr/share/netdata")' 'set(BUILD_INFO_CMAKE_CACHE_ARCHIVE_PATH "${placeholder "out"}/share/netdata")' ''; cmakeFlags = [ "-DWEB_DIR=share/netdata/web" (lib.cmakeBool "ENABLE_DASHBOARD" withCloudUi) (lib.cmakeBool "ENABLE_DBENGINE" withDBengine) (lib.cmakeBool "ENABLE_EXPORTER_PROMETHEUS_REMOTE_WRITE" withConnPrometheus) (lib.cmakeBool "ENABLE_JEMALLOC" true) (lib.cmakeBool "ENABLE_LIBBACKTRACE" withLibbacktrace) (lib.cmakeBool "ENABLE_ML" withML) (lib.cmakeBool "ENABLE_ND_MCP" withNdMcp) (lib.cmakeBool "ENABLE_NETDATA_JOURNAL_FILE_READER" withSystemdJournal) (lib.cmakeBool "ENABLE_PLUGIN_CUPS" withCups) (lib.cmakeBool "ENABLE_PLUGIN_EBPF" withEbpf) (lib.cmakeBool "ENABLE_PLUGIN_FREEIPMI" withIpmi) (lib.cmakeBool "ENABLE_PLUGIN_NETFLOW" withNetflow) (lib.cmakeBool "ENABLE_PLUGIN_NETWORK_VIEWER" withNetworkViewer) (lib.cmakeBool "ENABLE_PLUGIN_NFACCT" withNetfilter) (lib.cmakeBool "ENABLE_PLUGIN_OTEL" withOtel) (lib.cmakeBool "ENABLE_PLUGIN_SYSTEMD_JOURNAL" withSystemdJournal) (lib.cmakeBool "ENABLE_PLUGIN_SYSTEMD_UNITS" withSystemdUnits) (lib.cmakeBool "ENABLE_PLUGIN_XENSTAT" false) # Suggested by upstream. "-G Ninja" "-DNETDATA_SQLITE_SOURCE_PATH=${sqlite.src}" ] ++ lib.optional withML "-DNETDATA_DLIB_SOURCE_PATH=${dlib.src}"; postFixup = '' wrapProgram $out/bin/netdata-claim.sh --prefix PATH : ${lib.makeBinPath [ openssl ]} wrapProgram $out/libexec/netdata/plugins.d/cgroup-network-helper.sh --prefix PATH : ${lib.makeBinPath [ bash ]} wrapProgram $out/bin/netdatacli --set NETDATA_PIPENAME /run/netdata/ipc # Time to cleanup the output directory. cp $out/etc/netdata/edit-config $out/bin/netdata-edit-config mv $out/lib/netdata/conf.d $out/share/netdata/conf.d rm -rf $out/{var,usr,etc} ''; enableParallelBuilding = true; passthru = { nd-mcp = (buildGoModule { pname = "${finalAttrs.pname}-nd-mcp"; inherit (finalAttrs) version src; sourceRoot = "${finalAttrs.src.name}/src/web/mcp/bridges/stdio-golang"; vendorHash = "sha256-jyCTp52Dc2IuRwzGT+sHFljO30oqAMfe3xVdEpV+R2c="; proxyVendor = true; doCheck = false; subPackages = [ "." ]; ldflags = [ "-s" "-w" ]; meta = finalAttrs.meta // { description = "Netdata Model Context Protocol (MCP) Integration"; license = lib.licenses.gpl3Only; }; }).goModules; netdata-go-modules = (buildGoModule { pname = "${finalAttrs.pname}-go-plugins"; inherit (finalAttrs) version src; sourceRoot = "${finalAttrs.src.name}/src/go/plugin/go.d"; vendorHash = "sha256-hjq91syiZYhVT8udA2LTrBSr0IoYs1WolwAKhO+yTj4="; proxyVendor = true; doCheck = false; ldflags = [ "-s" "-w" "-X main.version=${finalAttrs.version}" ]; meta = finalAttrs.meta // { description = "Netdata orchestrator for data collection modules written in Go"; mainProgram = "godplugin"; license = lib.licenses.gpl3Only; }; }).goModules; inherit withIpmi withNdsudo withNetworkViewer withOtel withSystemdJournal ; tests.netdata = nixosTests.netdata; }; meta = { broken = stdenv.buildPlatform != stdenv.hostPlatform || withEbpf; description = "Real-time performance monitoring tool"; homepage = "https://www.netdata.cloud/"; changelog = "https://github.com/netdata/netdata/releases/tag/v${finalAttrs.version}"; license = [ lib.licenses.gpl3Plus ] ++ lib.optionals withCloudUi [ lib.licenses.ncul1 ]; mainProgram = "netdata"; platforms = lib.platforms.unix; maintainers = with lib.maintainers; [ mkg20001 rhoriguchi ]; }; } // lib.optionalAttrs (withNetflow || withOtel || withSystemdJournal) { cargoDeps = symlinkJoin { name = "cargo-vendor-dir"; paths = [ (rustPlatform.fetchCargoVendor { inherit (finalAttrs) pname version src cargoRoot ; hash = "sha256-u8x2vYIStJQvHokHmgL0fl6kCamM2dpl81re1BxSi0Y="; }) (rustPlatform.fetchCargoVendor { pname = "${finalAttrs.pname}-nd-jf"; inherit (finalAttrs) version src; cargoRoot = "${finalAttrs.cargoRoot}/jf"; hash = "sha256-yiznIyoTfLhfXl6wctvCULj9T+eHqjAL67NX2D1VUH4="; }) ]; }; cargoRoot = "src/crates"; } )