Proposal
While implement a new service discovery, there was a side discussion about total binary size of prometheus. I looked into this and provide some data and analytics of various tools. Not all tools provide useful data, but I would like to share them anyways.
Analysis
All analytice are done on a Linux/arm64 system on commit 5afa652
Binary Sizes
Command
Size
go build -o prometheus ./cmd/prometheus/
147063797
make build
150309941
go build -tags netgo,builtinassets,stringlabels -o prometheus ./cmd/prometheus/
150306223
go build -ldflags "-w -s" -tags netgo,builtinassets,stringlabels -o prometheus ./cmd/prometheus/
106496260
go build -ldflags "-w -s" -tags netgo,builtinassets,stringlabels -trimpath -o prometheus ./cmd/prometheus/
106365188
Root causes
With go tool nm with can see the size of an function.
Output
go tool nm -size -sort size prometheus 2>/dev/null | head -20
57b2f0 1032752 T github.com/aws/aws-sdk-go/aws/endpoints.init
44d6260 222156 r runtime.typelink
44a0460 217396 r runtime.findfunctab
65c8880 101696 D runtime.mheap_
16e19c0 55472 T k8s.io/api/core/v1.init
450c640 47320 r runtime.itablink
2a72bd0 40784 T main.main
26b6f40 40144 T github.com/prometheus/prometheus/promql/parser.(*yyParserImpl).Parse
65c0b00 32128 D runtime.semtable
65ed920 30736 D crypto/internal/edwards25519.basepointTablePrecomp
2602fd0 24208 T github.com/envoyproxy/go-control-plane/envoy/config/core/v3.(*HealthCheck).validate
1f6e820 22784 T github.com/google/gnostic-models/openapiv3.NewSchema
182da00 22288 T k8s.io/api/core/v1.(*PodSpec).Unmarshal
1f9b6c0 19824 T github.com/google/gnostic-models/openapiv3.(*Schema).ToRawInfo
654a820 19426 D golang.org/x/text/unicode/norm.decomps
654f420 19426 D vendor/golang.org/x/text/unicode/norm.decomps
19dbc50 19296 T github.com/google/gnostic-models/openapiv2.NewSchema
64b0000 19120 D go:buildinfo
4493420 19076 R runtime.modinfo.str
26df7d0 18176 T github.com/prometheus/prometheus/promql.(*evaluator).eval
Size by dependency
Top Level module size using go tool nm
go tool nm -size prometheus | \
awk '{ if ($2 ~ /^[0-9a-f]+$/ && $4 ~ /^[A-Za-z0-9_.\/-]+$/) print $1, $2, $3, $4 }' | \
awk '{ split($4, parts, "/"); print $1, parts[1]"/"parts[2] }' | \
awk '{sizes[$2] += strtonum("0x"$1)} END {for (p in sizes) printf "%10d %s\n", sizes[p], p}' | \
sort -nr | head
Output
305160767184 k8s.io/api
177496621969 github.com/prometheus
137972622256 github.com/envoyproxy
111311689078 github.com/aws
107515098633 k8s.io/client-go
70340285368 google.golang.org/protobuf
56254934555 golang.org/x
53955347533 k8s.io/apimachinery
49031451418 github.com/gogo
48935825720 go.opentelemetry.io/collector
34069508952 github.com/hashicorp
31793063480 go.opentelemetry.io/otel
29683894695 google.golang.org/grpc
28502163252 github.com/google
25715191976 github.com/cncf
23336618399 google.golang.org/api
21085652523 github.com/docker
19023559199 go.mongodb.org/mongo-driver
18305680280 github.com/go-openapi
18244298193 k8s.io/kube-openapi
Dependency size using go tool nm
go tool nm -size prometheus | \
awk '{ if (NF >= 4 && $2 ~ /^[0-9a-f]+$/) print $1, $4 }' | \
sed -E 's/[(].*//; s/[.](init|eq|func[0-9]+|itab|f64|type|r[0-9]+|[0-9]+)?$//' | \
awk '{sizes[$2] += strtonum("0x"$1)} END {for (p in sizes) printf "%12d %s\n", sizes[p], p}' | \
sort -nr | head -30
Output
187460189072 github.com/aws/aws-sdk-go/service/ec2
173795570320 google.golang.org/api/compute/v1
128769844624 k8s.io/client-go/gentype
123310559776 k8s.io/api/core/v1
76741162960 github.com/envoyproxy/go-control-plane/envoy/config/core/v3
43289213904 github.com/aws/aws-sdk-go/service/lightsail
41729295648 k8s.io/client-go/applyconfigurations/core/v1
33169262880 k8s.io/api/extensions/v1beta1
28205747008 github.com/google/gnostic-models/openapiv3
26608723168 k8s.io/api/resource/v1beta1
26304722368 github.com/gogo/protobuf/types
26134700848 k8s.io/api/resource/v1alpha3
25723067920 k8s.io/apimachinery/pkg/apis/meta/v1
25291560256 github.com/prometheus/prometheus/tsdb
25201402368 k8s.io/api/apps/v1beta2
23894107392 github.com/hashicorp/nomad/api
22645395008 k8s.io/api/storage/v1beta1
21439689056 k8s.io/api/apps/v1
21030856480 github.com/google/gnostic-models/openapiv2
20379399664 github.com/linode/linodego
20215934224 k8s.io/api/networking/v1beta1
19906622496 github.com/ionos-cloud/sdk-go/v6
19642529840 github.com/gogo/protobuf/protoc-gen-gogo/descriptor
18639160784 k8s.io/api/storage/v1
18234612304 k8s.io/api/admissionregistration/v1alpha1
18157175120 k8s.io/api/admissionregistration/v1
18079676384 github.com/digitalocean/godo
18028803936 k8s.io/api/admissionregistration/v1beta1
17227532784 k8s.io/api/apps/v1beta1
16881487632 github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3
goweight
goweight is another tool to track depenendcy sizes. However the number seems a bit odd because the sizes of the deps are more than the total size
go run github.com/jondot/goweight@latest --tags netgo,builtinassets,stringlabels ./cmd/prometheus/
124 MB github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4
80 MB github.com/aws/aws-sdk-go/service/ec2
57 MB google.golang.org/api/compute/v1
55 MB github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5
41 MB github.com/ionos-cloud/sdk-go/v6
24 MB k8s.io/api/core/v1
16 MB github.com/aws/aws-sdk-go/service/lightsail
13 MB runtime
12 MB github.com/envoyproxy/go-control-plane/envoy/config/core/v3
10 MB github.com/linode/linodego
9.8 MB github.com/aws/aws-sdk-go/service/ec2/ec2iface
8.7 MB net/http
8.5 MB k8s.io/client-go/kubernetes/typed/core/v1
7.8 MB github.com/digitalocean/godo
7.7 MB github.com/hetznercloud/hcloud-go/v2/hcloud
7.3 MB github.com/miekg/dns
7.2 MB k8s.io/client-go/applyconfigurations/core/v1
6.6 MB github.com/prometheus/prometheus/tsdb
6.4 MB google.golang.org/protobuf/internal/impl
6.2 MB k8s.io/apimachinery/pkg/apis/meta/v1
6.2 MB github.com/aws/aws-sdk-go/aws/endpoints
5.7 MB github.com/google/gnostic-models/openapiv3
5.6 MB github.com/gogo/protobuf/proto
5.6 MB github.com/google/gnostic-models/openapiv2
5.4 MB github.com/prometheus/prometheus/discovery/azure
5.1 MB k8s.io/api/extensions/v1beta1
5.0 MB github.com/hashicorp/nomad/api
4.7 MB github.com/prometheus/prometheus/discovery/kubernetes
4.5 MB github.com/hashicorp/consul/api
4.3 MB golang.org/x/net/http2
4.2 MB crypto/tls
4.1 MB k8s.io/api/apps/v1beta2
4.1 MB golang.org/x/sys/unix
4.1 MB google.golang.org/grpc
bloaty
bloaty works on ELF level, less go specific.
Run bloaty on prometheus with debug symbols
# go build -gcflags='-l -N' -tags netgo,builtinassets,stringlabels -o prometheus ./cmd/prometheus/
# bloaty prometheus -d symbols
FILE SIZE VM SIZE
-------------- --------------
40.9% 58.6Mi 41.7% 42.5Mi [168456 Others]
22.0% 31.5Mi 31.0% 31.5Mi [section .gopclntab]
17.8% 25.6Mi 25.1% 25.6Mi [section .rodata]
7.5% 10.8Mi 0.0% 0 [section .debug_info]
5.1% 7.30Mi 0.0% 0 [section .debug_loc]
3.1% 4.42Mi 0.0% 0 [section .debug_line]
1.1% 1.57Mi 0.0% 0 [section .debug_ranges]
1.0% 1.40Mi 0.0% 0 [section .debug_frame]
0.7% 1008Ki 1.0% 1008Ki github.com/aws/aws-sdk-go/aws/endpoints.init
0.2% 332Ki 0.3% 332Ki [section .noptrdata]
0.1% 217Ki 0.2% 217Ki runtime.typelink
0.1% 212Ki 0.2% 212Ki runtime.findfunctab
0.1% 145Ki 0.0% 0 [Unmapped]
0.1% 144Ki 0.1% 144Ki [section .data]
0.0% 39 0.1% 99.3Ki runtime.mheap_
0.0% 54.2Ki 0.1% 54.2Ki k8s.io/api/core/v1.init
0.0% 46.3Ki 0.0% 46.3Ki runtime.itablink
0.0% 39.9Ki 0.0% 39.8Ki main.main
0.0% 39.3Ki 0.0% 39.2Ki github.com/prometheus/prometheus/promql/parser.(*yyParserImpl).Parse
0.0% 41 0.0% 31.4Ki runtime.semtable
0.0% 75 0.0% 30.0Ki crypto/internal/edwards25519.basepointTablePrecomp
100.0% 143Mi 100.0% 101Mi TOTAL
Run bloaty on prometheus with stripped symbols
# go build -tags netgo,builtinassets,stringlabels -ldflags="-s -w" -o prometheus ./cmd/prometheus/
# bloaty prometheus -d symbols
FILE SIZE VM SIZE
-------------- --------------
41.8% 42.5Mi 41.7% 42.5Mi [section .text]
31.0% 31.5Mi 31.0% 31.5Mi [section .gopclntab]
25.9% 26.3Mi 25.8% 26.3Mi [section .rodata]
0.6% 636Ki 0.6% 636Ki [section .noptrdata]
0.3% 304Ki 0.3% 304Ki [section .data]
0.0% 0 0.3% 260Ki [section .bss]
0.2% 216Ki 0.2% 216Ki [section .typelink]
0.1% 145Ki 0.0% 0 [Unmapped]
0.0% 0 0.1% 78.9Ki [section .noptrbss]
0.0% 46.2Ki 0.0% 46.2Ki [section .itablink]
0.0% 18.7Ki 0.0% 18.7Ki [section .go.buildinfo]
0.0% 3.90Ki 0.0% 3.90Ki [LOAD #3 [RX]]
0.0% 1.10Ki 0.0% 1.10Ki [section .dynsym]
0.0% 936 0.0% 936 [section .rela.plt]
0.0% 672 0.0% 672 [section .dynstr]
0.0% 656 0.0% 656 [section .plt]
0.0% 597 0.0% 613 [9 Others]
0.0% 336 0.0% 336 [section .got.plt]
0.0% 304 0.0% 304 [section .dynamic]
0.0% 260 0.0% 0 [section .shstrtab]
0.0% 224 0.0% 224 [section .hash]
100.0% 101Mi 100.0% 101Mi TOTAL
go-size-analyzer
go-size-analyzer seems a new approach to identify
go run github.com/Zxilly/go-size-analyzer/cmd/gsa@latest prometheus
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ prometheus.x64 │
├─────────┬────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬───────────┤
│ PERCENT │ NAME │ SIZE │ TYPE │
├─────────┼────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼───────────┤
│ 15.60% │ .rodata │ 24 MB │ section │
│ 11.03% │ k8s.io/api │ 17 MB │ vendor │
│ 9.11% │ github.com/aws/aws-sdk-go │ 14 MB │ vendor │
│ 8.62% │ .strtab │ 13 MB │ section │
│ 7.69% │ .debug_info │ 12 MB │ section │
│ 7.52% │ k8s.io/client-go │ 11 MB │ vendor │
│ 5.12% │ google.golang.org/api │ 7.7 MB │ vendor │
│ 4.89% │ .debug_loc │ 7.4 MB │ section │
│ 3.55% │ github.com/prometheus/prometheus │ 5.4 MB │ vendor │
│ 3.54% │ .debug_line │ 5.3 MB │ section │
│ 2.69% │ .symtab │ 4.1 MB │ section │
│ 1.46% │ github.com/envoyproxy/go-control-plane/envoy │ 2.2 MB │ vendor │
│ 1.45% │ │ 2.2 MB │ generated │
│ 1.27% │ google.golang.org/protobuf │ 1.9 MB │ vendor │
│ 1.25% │ .debug_ranges │ 1.9 MB │ section │
│ 1.23% │ crypto │ 1.9 MB │ std │
│ 1.17% │ k8s.io/apimachinery │ 1.8 MB │ vendor │
│ 1.11% │ net │ 1.7 MB │ std │
│ 1.02% │ github.com/google/gnostic-models │ 1.5 MB │ vendor │
│ 0.97% │ go.opentelemetry.io/collector/pdata │ 1.5 MB │ vendor │
│ 0.95% │ .debug_frame │ 1.4 MB │ section │
│ 0.91% │ github.com/Azure/azure-sdk-for-go/sdk/azcore │ 1.4 MB │ vendor │
│ 0.79% │ runtime │ 1.2 MB │ std │
│ 0.76% │ github.com/gogo/protobuf │ 1.1 MB │ vendor │
│ 0.73% │ google.golang.org/grpc │ 1.1 MB │ vendor │
│ 0.66% │ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 │ 1.0 MB │ vendor │
│ 0.56% │ go.opentelemetry.io/otel │ 851 kB │ vendor │
│ 0.55% │ github.com/linode/linodego │ 836 kB │ vendor │
│ 0.48% │ go.mongodb.org/mongo-driver │ 723 kB │ vendor │
│ 0.45% │ github.com/modern-go/reflect2 │ 678 kB │ vendor │
│ 0.40% │ golang.org/x/net │ 608 kB │ vendor │
│ 0.38% │ github.com/digitalocean/godo │ 575 kB │ vendor │
│ 0.37% │ github.com/miekg/dns │ 566 kB │ vendor │
│ 0.36% │ github.com/hetznercloud/hcloud-go/v2 │ 551 kB │ vendor │
│ 0.36% │ github.com/klauspost/compress │ 548 kB │ vendor │
│ 0.36% │ slices │ 548 kB │ std │
│ 0.32% │ github.com/hashicorp/consul/api │ 483 kB │ vendor │
│ 0.31% │ github.com/docker/docker │ 474 kB │ vendor │
│ 0.31% │ k8s.io/kube-openapi │ 473 kB │ vendor │
│ 0.30% │ github.com/AzureAD/microsoft-authentication-library-for-go │ 450 kB │ vendor │
│ 0.29% │ github.com/json-iterator/go │ 438 kB │ vendor │
│ 0.29% │ go.uber.org/zap │ 436 kB │ vendor │
│ 0.28% │ github.com/hashicorp/nomad/api │ 426 kB │ vendor │
│ 0.28% │ github.com/gophercloud/gophercloud/v2 │ 422 kB │ vendor │
│ 0.28% │ github.com/alecthomas/kingpin/v2 │ 417 kB │ vendor │
│ 0.27% │ github.com/prometheus/client_golang │ 412 kB │ vendor │
│ 0.27% │ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 │ 410 kB │ vendor │
│ 0.24% │ golang.org/x/text │ 363 kB │ vendor │
│ 0.23% │ github.com/ionos-cloud/sdk-go/v6 │ 351 kB │ vendor │
│ 0.23% │ reflect │ 348 kB │ std │
│ 0.20% │ github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor │ 304 kB │ vendor │
│ 0.20% │ github.com/google/go-cmp │ 304 kB │ vendor │
│ 0.20% │ math │ 301 kB │ std │
│ 0.20% │ gopkg.in/yaml.v3 │ 300 kB │ vendor │
│ 0.19% │ sigs.k8s.io/structured-merge-diff/v4 │ 291 kB │ vendor │
│ 0.19% │ sigs.k8s.io/yaml │ 289 kB │ vendor │
│ 0.18% │ github.com/go-openapi/spec │ 276 kB │ vendor │
│ 0.18% │ text/template │ 271 kB │ std │
│ 0.17% │ gopkg.in/yaml.v2 │ 260 kB │ vendor │
│ 0.16% │ github.com/fxamacker/cbor/v2 │ 246 kB │ vendor │
│ 0.15% │ github.com/google/s2a-go │ 234 kB │ vendor │
│ 0.15% │ github.com/go-openapi/strfmt │ 231 kB │ vendor │
│ 0.15% │ github.com/prometheus/common │ 229 kB │ vendor │
│ 0.15% │ github.com/scaleway/scaleway-sdk-go │ 228 kB │ vendor │
│ 0.15% │ encoding/gob │ 228 kB │ std │
│ 0.15% │ .data │ 225 kB │ section │
│ 0.15% │ .typelink │ 224 kB │ section │
│ 0.14% │ github.com/cncf/xds/go │ 213 kB │ vendor │
│ 0.13% │ cloud.google.com/go/auth │ 198 kB │ vendor │
│ 0.12% │ os │ 181 kB │ std │
│ 0.12% │ regexp │ 177 kB │ std │
│ 0.11% │ github.com/go-resty/resty/v2 │ 170 kB │ vendor │
│ 0.11% │ github.com/grafana/regexp │ 166 kB │ vendor │
│ 0.11% │ golang.org/x/oauth2 │ 165 kB │ vendor │
│ 0.11% │ encoding/json │ 164 kB │ std │
│ 0.11% │ time │ 162 kB │ std │
│ 0.10% │ github.com/Azure/azure-sdk-for-go/sdk/azidentity │ 154 kB │ vendor │
│ 0.10% │ sigs.k8s.io/json │ 152 kB │ vendor │
│ 0.10% │ github.com/go-openapi/validate │ 148 kB │ vendor │
│ 0.09% │ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp │ 143 kB │ vendor │
│ 0.09% │ k8s.io/klog │ 133 kB │ vendor │
│ 0.09% │ html │ 131 kB │ std │
│ 0.09% │ log │ 130 kB │ std │
│ 0.08% │ google.golang.org/genproto/googleapis/api │ 128 kB │ vendor │
│ 0.08% │ github.com/vultr/govultr/v2 │ 128 kB │ vendor │
│ 0.08% │ main │ 126 kB │ main │
│ 0.08% │ encoding/xml │ 125 kB │ std │
│ 0.08% │ github.com/emicklei/go-restful/v3 │ 124 kB │ vendor │
│ 0.08% │ .noptrdata │ 118 kB │ section │
│ 0.07% │ github.com/jmespath/go-jmespath │ 113 kB │ vendor │
│ 0.07% │ internal/sync │ 100 kB │ std │
│ 0.07% │ github.com/puzpuzpuz/xsync/v3 │ 100 kB │ vendor │
│ 0.07% │ fmt │ 99 kB │ std │
│ 0.07% │ internal/profile │ 98 kB │ std │
│ 0.06% │ internal/poll │ 96 kB │ std │
│ 0.06% │ github.com/envoyproxy/protoc-gen-validate │ 95 kB │ vendor │
│ 0.06% │ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace │ 94 kB │ vendor │
│ 0.06% │ vendor/golang.org/x/text/unicode/norm │ 94 kB │ std │
│ 0.06% │ syscall │ 93 kB │ std │
│ 0.06% │ github.com/golang-jwt/jwt/v5 │ 88 kB │ vendor │
│ 0.06% │ go.opentelemetry.io/auto/sdk │ 87 kB │ vendor │
│ 0.06% │ github.com/gorilla/websocket │ 86 kB │ vendor │
│ 0.06% │ github.com/mailru/easyjson │ 85 kB │ vendor │
│ 0.06% │ github.com/go-zookeeper/zk │ 84 kB │ vendor │
│ 0.05% │ mime │ 79 kB │ std │
│ 0.05% │ internal/abi │ 77 kB │ std │
│ 0.05% │ sync │ 76 kB │ std │
│ 0.05% │ encoding/asn1 │ 72 kB │ std │
│ 0.05% │ github.com/mitchellh/mapstructure │ 72 kB │ vendor │
│ 0.05% │ strconv │ 71 kB │ std │
│ 0.05% │ github.com/armon/go-metrics │ 71 kB │ vendor │
│ 0.05% │ go.opentelemetry.io/proto/otlp │ 70 kB │ vendor │
│ 0.05% │ compress/flate │ 70 kB │ std │
│ 0.05% │ vendor/golang.org/x/crypto/chacha20poly1305 │ 70 kB │ std │
│ 0.05% │ gopkg.in/ini.v1 │ 68 kB │ vendor │
│ 0.04% │ vendor/golang.org/x/net/idna │ 65 kB │ std │
│ 0.04% │ github.com/hashicorp/go-retryablehttp │ 64 kB │ vendor │
│ 0.04% │ github.com/felixge/httpsnoop │ 62 kB │ vendor │
│ 0.04% │ golang.org/x/crypto │ 58 kB │ vendor │
│ 0.04% │ strings │ 55 kB │ std │
│ 0.04% │ github.com/go-logr/logr │ 55 kB │ vendor │
│ 0.04% │ github.com/go-openapi/swag │ 54 kB │ vendor │
│ 0.04% │ internal/reflectlite │ 53 kB │ std │
│ 0.03% │ github.com/davecgh/go-spew │ 51 kB │ vendor │
│ 0.03% │ github.com/googleapis/gax-go/v2 │ 50 kB │ vendor │
│ 0.03% │ go/doc │ 50 kB │ std │
│ 0.03% │ github.com/kylelemons/godebug │ 48 kB │ vendor │
│ 0.03% │ google.golang.org/genproto/googleapis/rpc │ 47 kB │ vendor │
│ 0.03% │ .itablink │ 47 kB │ section │
│ 0.03% │ io │ 44 kB │ std │
│ 0.03% │ context │ 44 kB │ std │
│ 0.03% │ github.com/hashicorp/go-hclog │ 43 kB │ vendor │
│ 0.03% │ encoding/binary │ 42 kB │ std │
│ 0.03% │ github.com/distribution/reference │ 42 kB │ vendor │
│ 0.03% │ github.com/hashicorp/go-immutable-radix │ 40 kB │ vendor │
│ 0.03% │ github.com/Code-Hex/go-generics-cache │ 40 kB │ vendor │
│ 0.03% │ github.com/prometheus/client_model │ 40 kB │ vendor │
│ 0.03% │ bytes │ 39 kB │ std │
│ 0.03% │ bufio │ 39 kB │ std │
│ 0.03% │ github.com/prometheus/procfs │ 38 kB │ vendor │
│ 0.02% │ github.com/kolo/xmlrpc │ 37 kB │ vendor │
│ 0.02% │ github.com/mwitkow/go-conntrack │ 37 kB │ vendor │
│ 0.02% │ github.com/google/gofuzz │ 36 kB │ vendor │
│ 0.02% │ cloud.google.com/go/compute/metadata │ 36 kB │ vendor │
│ 0.02% │ gopkg.in/inf.v0 │ 36 kB │ vendor │
│ 0.02% │ sort │ 35 kB │ std │
│ 0.02% │ vendor/golang.org/x/net/dns/dnsmessage │ 34 kB │ std │
│ 0.02% │ vendor/golang.org/x/net/http2/hpack │ 34 kB │ std │
│ 0.02% │ internal/runtime/maps │ 33 kB │ std │
│ 0.02% │ github.com/KimMachineGun/automemlimit │ 33 kB │ vendor │
│ 0.02% │ github.com/hashicorp/cronexpr │ 32 kB │ vendor │
│ 0.02% │ github.com/julienschmidt/httprouter │ 30 kB │ vendor │
│ 0.02% │ unicode │ 29 kB │ std │
│ 0.02% │ k8s.io/utils │ 29 kB │ vendor │
│ 0.02% │ github.com/oklog/ulid │ 28 kB │ vendor │
│ 0.02% │ github.com/go-openapi/errors │ 28 kB │ vendor │
│ 0.02% │ github.com/prometheus/exporter-toolkit │ 27 kB │ vendor │
│ 0.02% │ vendor/golang.org/x/crypto/cryptobyte │ 25 kB │ std │
│ 0.02% │ go.uber.org/automaxprocs │ 24 kB │ vendor │
│ 0.02% │ github.com/opencontainers/go-digest │ 24 kB │ vendor │
│ 0.02% │ github.com/Azure/azure-sdk-for-go/sdk/internal │ 23 kB │ vendor │
│ 0.02% │ vendor/golang.org/x/text/unicode/bidi │ 23 kB │ std │
│ 0.01% │ github.com/ovh/go-ovh │ 22 kB │ vendor │
│ 0.01% │ go.uber.org/atomic │ 21 kB │ vendor │
│ 0.01% │ github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics │ 21 kB │ vendor │
│ 0.01% │ path │ 20 kB │ std │
│ 0.01% │ hash │ 20 kB │ std │
│ 0.01% │ golang.org/x/sys │ 20 kB │ vendor │
│ 0.01% │ github.com/fsnotify/fsnotify │ 19 kB │ vendor │
│ 0.01% │ github.com/pkg/errors │ 19 kB │ vendor │
│ 0.01% │ encoding/base64 │ 19 kB │ std │
│ 0.01% │ .go.buildinfo │ 19 kB │ section │
│ 0.01% │ github.com/go-logr/stdr │ 18 kB │ vendor │
│ 0.01% │ github.com/prometheus/alertmanager │ 18 kB │ vendor │
│ 0.01% │ github.com/go-openapi/jsonpointer │ 18 kB │ vendor │
│ 0.01% │ golang.org/x/time │ 17 kB │ vendor │
│ 0.01% │ github.com/shurcooL/httpfs │ 17 kB │ vendor │
│ 0.01% │ github.com/asaskevich/govalidator │ 17 kB │ vendor │
│ 0.01% │ github.com/bboreham/go-loser │ 16 kB │ vendor │
│ 0.01% │ github.com/hashicorp/go-version │ 16 kB │ vendor │
│ 0.01% │ flag │ 15 kB │ std │
│ 0.01% │ internal/bisect │ 14 kB │ std │
│ 0.01% │ github.com/google/go-querystring │ 14 kB │ vendor │
│ 0.01% │ vendor/golang.org/x/net/http/httpproxy │ 13 kB │ std │
│ 0.01% │ text/tabwriter │ 13 kB │ std │
│ 0.01% │ unique │ 13 kB │ std │
│ 0.01% │ go.opentelemetry.io/collector/component │ 13 kB │ vendor │
│ 0.01% │ compress/gzip │ 13 kB │ std │
│ 0.01% │ github.com/googleapis/enterprise-certificate-proxy │ 12 kB │ vendor │
│ 0.01% │ github.com/hashicorp/go-multierror │ 11 kB │ vendor │
│ 0.01% │ github.com/grpc-ecosystem/grpc-gateway/v2 │ 11 kB │ vendor │
│ 0.01% │ github.com/prometheus/otlptranslator │ 11 kB │ vendor │
│ 0.01% │ internal/runtime/atomic │ 10 kB │ std │
│ 0.01% │ github.com/alecthomas/units │ 10 kB │ vendor │
│ 0.01% │ internal/godebug │ 9.4 kB │ std │
│ 0.01% │ expvar │ 9.4 kB │ std │
│ 0.01% │ github.com/beorn7/perks │ 9.3 kB │ vendor │
│ 0.01% │ embed │ 9.1 kB │ std │
│ 0.01% │ github.com/docker/go-connections │ 9.0 kB │ vendor │
│ 0.01% │ compress/zlib │ 8.8 kB │ std │
│ 0.01% │ internal/bytealg │ 8.7 kB │ std │
│ 0.01% │ github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil │ 8.5 kB │ vendor │
│ 0.01% │ internal/fmtsort │ 7.9 kB │ std │
│ 0.01% │ container/list │ 7.8 kB │ std │
│ 0.01% │ encoding/base32 │ 7.7 kB │ std │
│ 0.00% │ github.com/modern-go/concurrent │ 7.5 kB │ vendor │
│ 0.00% │ github.com/prometheus/sigv4 │ 7.5 kB │ vendor │
│ 0.00% │ vendor/golang.org/x/crypto/chacha20 │ 7.5 kB │ std │
│ 0.00% │ github.com/munnerz/goautoneg │ 7.1 kB │ vendor │
│ 0.00% │ github.com/hashicorp/golang-lru │ 6.8 kB │ vendor │
│ 0.00% │ internal/cpu │ 6.7 kB │ std │
│ 0.00% │ github.com/google/uuid │ 6.6 kB │ vendor │
│ 0.00% │ github.com/golang/protobuf │ 6.6 kB │ vendor │
│ 0.00% │ go.uber.org/multierr │ 6.5 kB │ vendor │
│ 0.00% │ github.com/fatih/color │ 6.5 kB │ vendor │
│ 0.00% │ go.opentelemetry.io/collector/processor │ 6.4 kB │ vendor │
│ 0.00% │ go.opentelemetry.io/collector/featuregate │ 6.3 kB │ vendor │
│ 0.00% │ golang.org/x/sync │ 6.3 kB │ vendor │
│ 0.00% │ vendor/golang.org/x/sys/cpu │ 6.0 kB │ std │
│ 0.00% │ errors │ 5.6 kB │ std │
│ 0.00% │ github.com/golang/snappy │ 5.5 kB │ vendor │
│ 0.00% │ github.com/go-openapi/jsonreference │ 5.1 kB │ vendor │
│ 0.00% │ encoding/hex │ 4.9 kB │ std │
│ 0.00% │ internal/filepathlite │ 4.8 kB │ std │
│ 0.00% │ vendor/golang.org/x/net/http/httpguts │ 4.7 kB │ std │
│ 0.00% │ internal/singleflight │ 4.6 kB │ std │
│ 0.00% │ github.com/xhit/go-str2duration/v2 │ 4.5 kB │ vendor │
│ 0.00% │ encoding/pem │ 4.5 kB │ std │
│ 0.00% │ internal/sysinfo │ 4.5 kB │ std │
│ 0.00% │ github.com/hashicorp/serf │ 4.5 kB │ vendor │
│ 0.00% │ internal/chacha8rand │ 4.4 kB │ std │
│ 0.00% │ github.com/edsrzf/mmap-go │ 4.3 kB │ vendor │
│ 0.00% │ golang.org/x/term │ 3.8 kB │ vendor │
│ 0.00% │ github.com/go-openapi/analysis │ 3.5 kB │ vendor │
│ 0.00% │ internal/syscall/unix │ 3.5 kB │ std │
│ 0.00% │ github.com/hashicorp/go-rootcerts │ 3.4 kB │ vendor │
│ 0.00% │ github.com/cespare/xxhash/v2 │ 3.2 kB │ vendor │
│ 0.00% │ vendor/golang.org/x/crypto/internal/poly1305 │ 2.8 kB │ std │
│ 0.00% │ go.opentelemetry.io/collector/confmap │ 2.7 kB │ vendor │
│ 0.00% │ testing │ 2.7 kB │ std │
│ 0.00% │ github.com/stretchr/testify │ 2.6 kB │ vendor │
│ 0.00% │ container/heap │ 2.6 kB │ std │
│ 0.00% │ internal/stringslite │ 2.6 kB │ std │
│ 0.00% │ github.com/go-openapi/loads │ 2.6 kB │ vendor │
│ 0.00% │ github.com/docker/go-units │ 2.6 kB │ vendor │
│ 0.00% │ weak │ 2.4 kB │ std │
│ 0.00% │ vendor/golang.org/x/text/secure/bidirule │ 2.4 kB │ std │
│ 0.00% │ go.opentelemetry.io/collector/internal/telemetry │ 2.2 kB │ vendor │
│ 0.00% │ internal/runtime/exithook │ 2.0 kB │ std │
│ 0.00% │ github.com/cenkalti/backoff/v4 │ 1.9 kB │ vendor │
│ 0.00% │ internal/testlog │ 1.9 kB │ std │
│ 0.00% │ go/token │ 1.7 kB │ std │
│ 0.00% │ github.com/pkg/browser │ 1.7 kB │ vendor │
│ 0.00% │ go.opentelemetry.io/collector/pipeline │ 1.7 kB │ vendor │
│ 0.00% │ github.com/oklog/run │ 1.6 kB │ vendor │
│ 0.00% │ github.com/jpillora/backoff │ 1.6 kB │ vendor │
│ 0.00% │ internal/lazyregexp │ 1.5 kB │ std │
│ 0.00% │ github.com/dennwc/varint │ 1.3 kB │ vendor │
│ 0.00% │ github.com/facette/natsort │ 1.1 kB │ vendor │
│ 0.00% │ github.com/mitchellh/copystructure │ 1.1 kB │ vendor │
│ 0.00% │ gopkg.in/evanphx/json-patch.v4 │ 1.1 kB │ vendor │
│ 0.00% │ internal/saferio │ 1.1 kB │ std │
│ 0.00% │ .dynsym │ 1.1 kB │ section │
│ 0.00% │ .rela.plt │ 936 B │ section │
│ 0.00% │ github.com/josharian/intern │ 861 B │ vendor │
│ 0.00% │ internal/itoa │ 777 B │ std │
│ 0.00% │ go/parser │ 739 B │ std │
│ 0.00% │ github.com/x448/float16 │ 737 B │ vendor │
│ 0.00% │ .plt │ 640 B │ section │
│ 0.00% │ .dynstr │ 629 B │ section │
│ 0.00% │ database/sql │ 585 B │ std │
│ 0.00% │ github.com/hashicorp/go-cleanhttp │ 550 B │ vendor │
│ 0.00% │ internal/runtime/syscall │ 538 B │ std │
│ 0.00% │ github.com/spf13/pflag │ 448 B │ vendor │
│ 0.00% │ .shstrtab │ 403 B │ section │
│ 0.00% │ github.com/opencontainers/image-spec │ 381 B │ vendor │
│ 0.00% │ internal/profilerecord │ 367 B │ std │
│ 0.00% │ .debug_abbrev │ 343 B │ section │
│ 0.00% │ .got.plt │ 336 B │ section │
│ 0.00% │ github.com/pbnjay/memory │ 327 B │ vendor │
│ 0.00% │ github.com/mattn/go-isatty │ 305 B │ vendor │
│ 0.00% │ .dynamic │ 304 B │ section │
│ 0.00% │ internal/runtime/sys │ 281 B │ std │
│ 0.00% │ iter │ 272 B │ std │
│ 0.00% │ maps │ 224 B │ std │
│ 0.00% │ .hash │ 212 B │ section │
│ 0.00% │ go.uber.org/goleak │ 193 B │ vendor │
│ 0.00% │ .go.fipsinfo │ 120 B │ section │
│ 0.00% │ .note.go.buildid │ 100 B │ section │
│ 0.00% │ .gnu.version │ 88 B │ section │
│ 0.00% │ x_cgo_munmap │ 84 B │ std │
│ 0.00% │ .gnu.version_r │ 80 B │ section │
│ 0.00% │ .debug_gdb_scripts │ 42 B │ section │
│ 0.00% │ .note.gnu.build-id │ 36 B │ section │
│ 0.00% │ .interp │ 28 B │ section │
│ 0.00% │ .rela │ 24 B │ section │
│ 0.00% │ .text │ 16 B │ section │
│ 0.00% │ .got │ 8 B │ section │
│ 0.00% │ github.com/knadh/koanf/maps │ 0 B │ vendor │
│ 0.00% │ github.com/moby/docker-image-spec │ 0 B │ vendor │
│ 0.00% │ github.com/mdlayher/socket │ 0 B │ vendor │
│ 0.00% │ github.com/coreos/go-systemd/v22 │ 0 B │ vendor │
│ 0.00% │ github.com/go-viper/mapstructure/v2 │ 0 B │ vendor │
│ 0.00% │ golang.org/x/exp │ 0 B │ vendor │
│ 0.00% │ github.com/mitchellh/reflectwalk │ 0 B │ vendor │
│ 0.00% │ go.opentelemetry.io/contrib/bridges/otelzap │ 0 B │ vendor │
│ 0.00% │ github.com/knadh/koanf/v2 │ 0 B │ vendor │
│ 0.00% │ github.com/mattn/go-colorable │ 0 B │ vendor │
│ 0.00% │ github.com/knadh/koanf/providers/confmap │ 0 B │ vendor │
│ 0.00% │ github.com/hashicorp/errwrap │ 0 B │ vendor │
│ 0.00% │ github.com/pmezard/go-difflib │ 0 B │ vendor │
│ 0.00% │ go.opentelemetry.io/collector/semconv │ 0 B │ vendor │
│ 0.00% │ go.opentelemetry.io/collector/consumer │ 0 B │ vendor │
│ 0.00% │ github.com/mdlayher/vsock │ 0 B │ vendor │
├─────────┼────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼───────────┤
│ 100.00% │ Known │ 151 MB │ │
│ 100% │ Total │ 151 MB │ │
└─────────┴────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴───────────┘
Tool summary
go tool nm provide some data, but not enough insights.
goweight is not useful, since the numbers seems odd. go-size-analyzer seems better here.
bloaty print some nice numbers, but not sure if they really helpful.
go-size-analyzer seems to be the best tooling to get an oversight about the binary.
Outcome
github.com/aws/aws-sdk-go/aws/endpoints seems to be one of the biggest here, not overall not heavy. A migration to SDK v2 maybe help here: Migrate AWS discovery code to a new AWS SDK #15572
k8s.io/api might be big as well. Not sure if its worth to have to full kubernetes client on board for fetching only pods, services, endpoints. (approx. 28MB)
Strip debug symbols saves up to 30MB (-ldflags "-w -s")
go-size-analyzer has a diff mode. It can be integrated into CI have the awareness of new dependency sizes. Example
go run github.com/Zxilly/go-size-analyzer/cmd/gsa@latest prometheus prometheus.debug
┌────────────────────────────────────────────────────────────────────────────┐
│ Diff between prometheus and prometheus.debug │
├─────────┬──────────────────────────────────┬──────────┬──────────┬─────────┤
│ PERCENT │ NAME │ OLD SIZE │ NEW SIZE │ DIFF │
├─────────┼──────────────────────────────────┼──────────┼──────────┼─────────┤
│ +100% │ github.com/shurcooL/httpfs │ │ 14 kB │ +14 kB │
│ +0.00% │ runtime │ 1.1 MB │ 1.1 MB │ +5 B │
│ -0.01% │ <autogenerated> │ 1.9 MB │ 1.9 MB │ -288 B │
│ -0.14% │ text/template │ 231 kB │ 230 kB │ -325 B │
│ -22.60% │ embed │ 10 kB │ 7.9 kB │ -2.3 kB │
│ -0.46% │ net │ 1.5 MB │ 1.5 MB │ -7.0 kB │
│ -4.44% │ github.com/prometheus/common │ 209 kB │ 199 kB │ -9.3 kB │
│ -42.38% │ github.com/prometheus/prometheus │ 8.1 MB │ 4.7 MB │ -3.4 MB │
├─────────┼──────────────────────────────────┼──────────┼──────────┼─────────┤
│ +0.04% │ .debug_line │ 4.7 MB │ 4.7 MB │ +2.1 kB │
│ +0.01% │ .debug_info │ 12 MB │ 12 MB │ +719 B │
│ +0.03% │ .debug_ranges │ 1.6 MB │ 1.6 MB │ +515 B │
│ +0.00% │ .strtab │ 13 MB │ 13 MB │ +394 B │
│ +0.00% │ .rodata │ 24 MB │ 24 MB │ +22 B │
│ +0.08% │ .go.buildinfo │ 19 kB │ 19 kB │ +16 B │
│ +0.02% │ .itablink │ 47 kB │ 47 kB │ +8 B │
│ +0.00% │ .typelink │ 224 kB │ 224 kB │ +4 B │
│ -0.00% │ .symtab │ 4.1 MB │ 4.1 MB │ -72 B │
│ -0.07% │ .data │ 225 kB │ 224 kB │ -152 B │
│ -0.08% │ .debug_frame │ 1.5 MB │ 1.5 MB │ -1.1 kB │
│ -0.29% │ .debug_loc │ 7.7 MB │ 7.6 MB │ -22 kB │
├─────────┼──────────────────────────────────┼──────────┼──────────┼─────────┤
│ -2.33% │ prometheus │ 150 MB │ 146 MB │ -3.5 MB │
│ │ prometheus.debug │ │ │ │
└─────────┴──────────────────────────────────┴──────────┴──────────┴─────────┘
Proposal
While implement a new service discovery, there was a side discussion about total binary size of prometheus. I looked into this and provide some data and analytics of various tools. Not all tools provide useful data, but I would like to share them anyways.
Analysis
All analytice are done on a Linux/arm64 system on commit 5afa652
Binary Sizes
go build -o prometheus ./cmd/prometheus/make buildgo build -tags netgo,builtinassets,stringlabels -o prometheus ./cmd/prometheus/go build -ldflags "-w -s" -tags netgo,builtinassets,stringlabels -o prometheus ./cmd/prometheus/go build -ldflags "-w -s" -tags netgo,builtinassets,stringlabels -trimpath -o prometheus ./cmd/prometheus/Root causes
With
go tool nmwith can see the size of an function.Output
Size by dependency
Top Level module size using
go tool nmOutput
Dependency size using
go tool nmOutput
goweight
goweight is another tool to track depenendcy sizes. However the number seems a bit odd because the sizes of the deps are more than the total size
go run github.com/jondot/goweight@latest --tags netgo,builtinassets,stringlabels ./cmd/prometheus/
bloaty
bloaty works on ELF level, less go specific.
Run bloaty on prometheus with debug symbols
Run bloaty on prometheus with stripped symbols
go-size-analyzer
go-size-analyzer seems a new approach to identify
go run github.com/Zxilly/go-size-analyzer/cmd/gsa@latest prometheus
Tool summary
go tool nmprovide some data, but not enough insights.Outcome
github.com/aws/aws-sdk-go/aws/endpointsseems to be one of the biggest here, not overall not heavy. A migration to SDK v2 maybe help here: Migrate AWS discovery code to a new AWS SDK #15572-ldflags "-w -s")go run github.com/Zxilly/go-size-analyzer/cmd/gsa@latest prometheus prometheus.debug