nixpkgs/pkgs/servers/monitoring/prometheus/default.nix
Corbin f3cc015b87 prometheus: Optionally remove more service discovery.
Almost all service discovery can now be disabled, except for DNS-,
HTTP-, and file-based service discovery, which do not appear to include
extra code in the binary.

Before this change, bin/prometheus was about 38M and bin/promtool was
51M. Now, bin/prometheus is about 31M and bin/promtool is about 44M.
Assuming all service discovery is disabled, of course.
2022-02-06 15:16:27 -08:00

192 lines
5.9 KiB
Nix

{ stdenv
, lib
, go
, pkgs
, nodejs-14_x
, nodePackages
, buildGoModule
, fetchFromGitHub
, mkYarnPackage
, nixosTests
, fetchpatch
, enableAWS ? true
, enableAzure ? true
, enableConsul ? true
, enableDigitalOcean ? true
, enableEureka ? true
, enableGCE ? true
, enableHetzner ? true
, enableKubernetes ? true
, enableLinode ? true
, enableMarathon ? true
, enableMoby ? true
, enableOpenstack ? true
, enablePuppetDB ? true
, enableScaleway ? true
, enableTriton ? true
, enableUyuni ? true
, enableXDS ? true
, enableZookeeper ? true
}:
let
version = "2.30.3";
src = fetchFromGitHub {
rev = "v${version}";
owner = "prometheus";
repo = "prometheus";
sha256 = "1as6x5bsp7mxa4rp7jhyjlpcvzqm1zngnwvp73rc4rwhz8w8vm3k";
};
goPackagePath = "github.com/prometheus/prometheus";
codemirrorNode = import ./webui/codemirror-promql {
inherit pkgs;
nodejs = nodejs-14_x;
inherit (stdenv.hostPlatform) system;
};
webuiNode = import ./webui/webui {
inherit pkgs;
nodejs = nodejs-14_x;
inherit (stdenv.hostPlatform) system;
};
codemirror = stdenv.mkDerivation {
name = "prometheus-webui-codemirror-promql";
src = "${src}/web/ui/module/codemirror-promql";
buildInputs = [ nodejs-14_x nodePackages.typescript codemirrorNode.nodeDependencies ];
configurePhase = ''
ln -s ${codemirrorNode.nodeDependencies}/lib/node_modules node_modules
'';
buildPhase = ''
PUBLIC_URL=. npm run build
'';
installPhase = ''
mkdir -p $out
mv lib dist $out
'';
distPhase = ":";
};
webui = stdenv.mkDerivation {
name = "prometheus-webui";
src = "${src}/web/ui/react-app";
buildInputs = [ nodejs-14_x webuiNode.nodeDependencies ];
# create `node_modules/.cache` dir (we need writeable .cache)
# and then copy the rest over.
configurePhase = ''
mkdir -p node_modules/{.cache,.bin}
cp -a ${webuiNode.nodeDependencies}/lib/node_modules/. node_modules
'';
buildPhase = "PUBLIC_URL=. npm run build";
installPhase = "mv build $out";
distPhase = "true";
};
in
buildGoModule rec {
pname = "prometheus";
inherit src version;
vendorSha256 = "0qyv8vybx5wg8k8hwvrpp4hz9wv6g4kf9sq5v5qc2bxx6apc0s9r";
excludedPackages = [ "documentation/prometheus-mixin" ];
nativeBuildInputs = [ nodejs-14_x ];
postPatch = ''
# we don't want this anyways, as we
# build modules for them
echo "exit 0" > web/ui/module/build.sh
ln -s ${webuiNode.nodeDependencies}/lib/node_modules web/ui/react-app/node_modules
ln -s ${webui} web/ui/static/react
# webui-codemirror
ln -s ${codemirror}/dist web/ui/module/codemirror-promql/dist
ln -s ${codemirror}/lib web/ui/module/codemirror-promql/lib
# Disable some service discovery to shrink binaries.
${lib.optionalString (!enableAWS)
"sed -i -e '/register aws/d' discovery/install/install.go"}
${lib.optionalString (!enableAzure)
"sed -i -e '/register azure/d' discovery/install/install.go"}
${lib.optionalString (!enableConsul)
"sed -i -e '/register consul/d' discovery/install/install.go"}
${lib.optionalString (!enableDigitalOcean)
"sed -i -e '/register digitalocean/d' discovery/install/install.go"}
${lib.optionalString (!enableEureka)
"sed -i -e '/register eureka/d' discovery/install/install.go"}
${lib.optionalString (!enableGCE)
"sed -i -e '/register gce/d' discovery/install/install.go"}
${lib.optionalString (!enableHetzner)
"sed -i -e '/register hetzner/d' discovery/install/install.go"}
${lib.optionalString (!enableKubernetes)
"sed -i -e '/register kubernetes/d' discovery/install/install.go"}
${lib.optionalString (!enableLinode)
"sed -i -e '/register linode/d' discovery/install/install.go"}
${lib.optionalString (!enableMarathon)
"sed -i -e '/register marathon/d' discovery/install/install.go"}
${lib.optionalString (!enableMoby)
"sed -i -e '/register moby/d' discovery/install/install.go"}
${lib.optionalString (!enableOpenstack)
"sed -i -e '/register openstack/d' discovery/install/install.go"}
${lib.optionalString (!enablePuppetDB)
"sed -i -e '/register puppetdb/d' discovery/install/install.go"}
${lib.optionalString (!enableScaleway)
"sed -i -e '/register scaleway/d' discovery/install/install.go"}
${lib.optionalString (!enableTriton)
"sed -i -e '/register triton/d' discovery/install/install.go"}
${lib.optionalString (!enableUyuni)
"sed -i -e '/register uyuni/d' discovery/install/install.go"}
${lib.optionalString (!enableXDS)
"sed -i -e '/register xds/d' discovery/install/install.go"}
${lib.optionalString (!enableZookeeper)
"sed -i -e '/register zookeeper/d' discovery/install/install.go"}
'';
tags = [ "builtinassets" ];
ldflags =
let
t = "${goPackagePath}/vendor/github.com/prometheus/common/version";
in
[
"-X ${t}.Version=${version}"
"-X ${t}.Revision=unknown"
"-X ${t}.Branch=unknown"
"-X ${t}.BuildUser=nix@nixpkgs"
"-X ${t}.BuildDate=unknown"
"-X ${t}.GoVersion=${lib.getVersion go}"
];
# only run this in the real build, not during the vendor build
# this should probably be fixed in buildGoModule
preBuild = ''
if [ -d vendor ]; then make assets; fi
'';
preInstall = ''
mkdir -p "$out/share/doc/prometheus" "$out/etc/prometheus"
cp -a $src/documentation/* $out/share/doc/prometheus
cp -a $src/console_libraries $src/consoles $out/etc/prometheus
'';
# doCheck = !stdenv.isDarwin; # https://hydra.nixos.org/build/130673870/nixlog/1
doCheck = false;
passthru.tests = { inherit (nixosTests) prometheus; };
meta = with lib; {
description = "Service monitoring system and time series database";
homepage = "https://prometheus.io";
license = licenses.asl20;
maintainers = with maintainers; [ benley fpletz globin willibutz Frostman ];
platforms = platforms.unix;
};
}