From d55b42eabbd4cc4c00b229a15ffe2d599bed5501 Mon Sep 17 00:00:00 2001 From: Frank Davidson Date: Thu, 12 Mar 2020 14:17:26 -0400 Subject: [PATCH] :Issue 234: Split into reusable packages. Signed-off-by: Frank Davidson Signed-off-by: Frank Davidson --- CHANGELOG.md | 572 +- CONTRIBUTING.md | 36 +- Dockerfile | 26 +- LICENSE | 402 +- MAINTAINERS.md | 2 +- Makefile | 56 +- Makefile.common | 578 +- NOTICE | 10 +- README.md | 948 +- VERSION | 2 +- bridge_test.go | 886 +- event_test.go | 161 +- exporter_benchmark_test.go | 311 +- exporter_test.go | 1933 +-- go.mod | 30 +- go.sum | 1 + main.go | 716 +- pkg/clock/clock.go | 82 +- pkg/event.go~ | 133 + pkg/event/event.go | 134 + pkg/event/event.go~ | 134 + pkg/exporter/exporter.go | 173 + pkg/exporter/exporter.go~ | 172 + pkg/line/line.go | 241 + pkg/line/line.go~ | 241 + pkg/listener/listener.go | 138 + pkg/listener/listener.go~ | 138 + pkg/mapper/action.go | 84 +- pkg/mapper/escape.go | 148 +- pkg/mapper/escape_test.go | 112 +- pkg/mapper/fsm/README.md | 264 +- pkg/mapper/fsm/dump.go | 96 +- pkg/mapper/fsm/formatter.go | 152 +- pkg/mapper/fsm/fsm.go | 652 +- pkg/mapper/fsm/minmax.go | 60 +- pkg/mapper/mapper.go | 772 +- pkg/mapper/mapper_benchmark_test.go | 2000 +-- pkg/mapper/mapper_cache.go | 396 +- pkg/mapper/mapper_test.go | 2064 +-- pkg/mapper/match.go | 82 +- pkg/mapper/metric_type.go | 86 +- pkg/mapper/timer.go | 82 +- pkg/metrics/metrics.go | 54 + pkg/metrics/metrics.go~ | 42 + pkg/registry/registry.go | 370 + pkg/registry/registry.go~ | 356 + pkg/util/util.go | 53 + pkg/util/util.go~ | 53 + statsd_exporter.exe | Bin 0 -> 14264320 bytes vendor/github.com/alecthomas/template/LICENSE | 54 +- .../github.com/alecthomas/template/README.md | 50 +- vendor/github.com/alecthomas/template/doc.go | 812 +- vendor/github.com/alecthomas/template/exec.go | 1690 +- .../github.com/alecthomas/template/funcs.go | 1196 +- vendor/github.com/alecthomas/template/go.mod | 2 +- .../github.com/alecthomas/template/helper.go | 216 +- .../alecthomas/template/parse/lex.go | 1112 +- .../alecthomas/template/parse/node.go | 1668 +- .../alecthomas/template/parse/parse.go | 1400 +- .../alecthomas/template/template.go | 436 +- vendor/github.com/alecthomas/units/COPYING | 38 +- vendor/github.com/alecthomas/units/README.md | 22 +- vendor/github.com/alecthomas/units/bytes.go | 166 +- vendor/github.com/alecthomas/units/doc.go | 26 +- vendor/github.com/alecthomas/units/go.mod | 2 +- vendor/github.com/alecthomas/units/si.go | 52 +- vendor/github.com/alecthomas/units/util.go | 276 +- vendor/github.com/beorn7/perks/LICENSE | 40 +- .../beorn7/perks/quantile/exampledata.txt | 4776 +++--- .../beorn7/perks/quantile/stream.go | 632 +- vendor/github.com/go-kit/kit/LICENSE | 44 +- vendor/github.com/go-kit/kit/log/README.md | 302 +- vendor/github.com/go-kit/kit/log/doc.go | 232 +- .../github.com/go-kit/kit/log/json_logger.go | 178 +- vendor/github.com/go-kit/kit/log/level/doc.go | 44 +- .../github.com/go-kit/kit/log/level/level.go | 410 +- vendor/github.com/go-kit/kit/log/log.go | 270 +- .../go-kit/kit/log/logfmt_logger.go | 124 +- .../github.com/go-kit/kit/log/nop_logger.go | 16 +- vendor/github.com/go-kit/kit/log/stdlib.go | 232 +- vendor/github.com/go-kit/kit/log/sync.go | 232 +- vendor/github.com/go-kit/kit/log/value.go | 220 +- vendor/github.com/go-logfmt/logfmt/.gitignore | 8 +- .../github.com/go-logfmt/logfmt/.travis.yml | 32 +- .../github.com/go-logfmt/logfmt/CHANGELOG.md | 82 +- vendor/github.com/go-logfmt/logfmt/LICENSE | 44 +- vendor/github.com/go-logfmt/logfmt/README.md | 66 +- vendor/github.com/go-logfmt/logfmt/decode.go | 474 +- vendor/github.com/go-logfmt/logfmt/doc.go | 12 +- vendor/github.com/go-logfmt/logfmt/encode.go | 644 +- vendor/github.com/go-logfmt/logfmt/fuzz.go | 252 +- vendor/github.com/go-logfmt/logfmt/go.mod | 6 +- vendor/github.com/go-logfmt/logfmt/go.sum | 4 +- .../github.com/go-logfmt/logfmt/jsonstring.go | 554 +- vendor/github.com/golang/protobuf/AUTHORS | 6 +- .../github.com/golang/protobuf/CONTRIBUTORS | 6 +- vendor/github.com/golang/protobuf/LICENSE | 56 +- .../github.com/golang/protobuf/proto/clone.go | 506 +- .../golang/protobuf/proto/decode.go | 854 +- .../golang/protobuf/proto/deprecated.go | 126 +- .../golang/protobuf/proto/discard.go | 700 +- .../golang/protobuf/proto/encode.go | 406 +- .../github.com/golang/protobuf/proto/equal.go | 602 +- .../golang/protobuf/proto/extensions.go | 1214 +- .../github.com/golang/protobuf/proto/lib.go | 1930 +-- .../golang/protobuf/proto/message_set.go | 362 +- .../golang/protobuf/proto/pointer_reflect.go | 720 +- .../golang/protobuf/proto/pointer_unsafe.go | 626 +- .../golang/protobuf/proto/properties.go | 1088 +- .../golang/protobuf/proto/table_marshal.go | 5552 +++---- .../golang/protobuf/proto/table_merge.go | 1308 +- .../golang/protobuf/proto/table_unmarshal.go | 4106 ++--- .../github.com/golang/protobuf/proto/text.go | 1686 +- .../golang/protobuf/proto/text_parser.go | 1760 +- .../hashicorp/golang-lru/.gitignore | 46 +- vendor/github.com/hashicorp/golang-lru/2q.go | 446 +- .../github.com/hashicorp/golang-lru/LICENSE | 724 +- .../github.com/hashicorp/golang-lru/README.md | 50 +- vendor/github.com/hashicorp/golang-lru/arc.go | 514 +- vendor/github.com/hashicorp/golang-lru/doc.go | 42 +- vendor/github.com/hashicorp/golang-lru/go.mod | 2 +- vendor/github.com/hashicorp/golang-lru/lru.go | 232 +- .../hashicorp/golang-lru/simplelru/lru.go | 322 +- .../golang-lru/simplelru/lru_interface.go | 72 +- .../go-windows-terminal-sequences/LICENSE | 18 +- .../go-windows-terminal-sequences/README.md | 80 +- .../go-windows-terminal-sequences/go.mod | 2 +- .../sequences.go | 72 +- vendor/github.com/kr/logfmt/.gitignore | 6 +- vendor/github.com/kr/logfmt/Readme | 24 +- vendor/github.com/kr/logfmt/decode.go | 368 +- vendor/github.com/kr/logfmt/scanner.go | 298 +- vendor/github.com/kr/logfmt/unquote.go | 298 +- .../golang_protobuf_extensions/LICENSE | 402 +- .../golang_protobuf_extensions/NOTICE | 2 +- .../pbutil/.gitignore | 2 +- .../pbutil/Makefile | 14 +- .../pbutil/decode.go | 150 +- .../golang_protobuf_extensions/pbutil/doc.go | 32 +- .../pbutil/encode.go | 92 +- vendor/github.com/pkg/errors/.gitignore | 48 +- vendor/github.com/pkg/errors/.travis.yml | 30 +- vendor/github.com/pkg/errors/LICENSE | 46 +- vendor/github.com/pkg/errors/README.md | 104 +- vendor/github.com/pkg/errors/appveyor.yml | 64 +- vendor/github.com/pkg/errors/errors.go | 564 +- vendor/github.com/pkg/errors/stack.go | 294 +- .../prometheus/client_golang/LICENSE | 402 +- .../prometheus/client_golang/NOTICE | 46 +- .../client_golang/prometheus/.gitignore | 2 +- .../client_golang/prometheus/README.md | 2 +- .../client_golang/prometheus/build_info.go | 58 +- .../prometheus/build_info_pre_1.12.go | 44 +- .../client_golang/prometheus/collector.go | 240 +- .../client_golang/prometheus/counter.go | 554 +- .../client_golang/prometheus/desc.go | 368 +- .../client_golang/prometheus/doc.go | 400 +- .../prometheus/expvar_collector.go | 238 +- .../client_golang/prometheus/fnv.go | 84 +- .../client_golang/prometheus/gauge.go | 572 +- .../client_golang/prometheus/go_collector.go | 792 +- .../client_golang/prometheus/histogram.go | 1172 +- .../prometheus/internal/metric.go | 170 +- .../client_golang/prometheus/labels.go | 174 +- .../client_golang/prometheus/metric.go | 348 +- .../client_golang/prometheus/observer.go | 104 +- .../prometheus/process_collector.go | 302 +- .../prometheus/process_collector_other.go | 130 +- .../prometheus/process_collector_windows.go | 224 +- .../prometheus/promhttp/delegator.go | 714 +- .../client_golang/prometheus/promhttp/http.go | 698 +- .../prometheus/promhttp/instrument_client.go | 438 +- .../prometheus/promhttp/instrument_server.go | 894 +- .../client_golang/prometheus/registry.go | 1890 +-- .../client_golang/prometheus/summary.go | 1472 +- .../client_golang/prometheus/timer.go | 108 +- .../client_golang/prometheus/untyped.go | 84 +- .../client_golang/prometheus/value.go | 324 +- .../client_golang/prometheus/vec.go | 944 +- .../client_golang/prometheus/wrap.go | 400 +- .../prometheus/client_model/LICENSE | 402 +- .../github.com/prometheus/client_model/NOTICE | 10 +- .../prometheus/client_model/go/metrics.pb.go | 1258 +- vendor/github.com/prometheus/common/LICENSE | 402 +- vendor/github.com/prometheus/common/NOTICE | 10 +- .../prometheus/common/expfmt/decode.go | 858 +- .../prometheus/common/expfmt/encode.go | 176 +- .../prometheus/common/expfmt/expfmt.go | 76 +- .../prometheus/common/expfmt/fuzz.go | 72 +- .../prometheus/common/expfmt/text_create.go | 932 +- .../prometheus/common/expfmt/text_parse.go | 1528 +- .../bitbucket.org/ww/goautoneg/README.txt | 134 +- .../bitbucket.org/ww/goautoneg/autoneg.go | 324 +- .../common/log/eventlog_formatter.go | 178 +- .../github.com/prometheus/common/log/log.go | 728 +- .../prometheus/common/log/syslog_formatter.go | 252 +- .../prometheus/common/model/alert.go | 272 +- .../prometheus/common/model/fingerprinting.go | 210 +- .../github.com/prometheus/common/model/fnv.go | 84 +- .../prometheus/common/model/labels.go | 420 +- .../prometheus/common/model/labelset.go | 338 +- .../prometheus/common/model/metric.go | 204 +- .../prometheus/common/model/model.go | 32 +- .../prometheus/common/model/signature.go | 288 +- .../prometheus/common/model/silence.go | 212 +- .../prometheus/common/model/time.go | 540 +- .../prometheus/common/model/value.go | 832 +- .../prometheus/common/promlog/flag/flag.go | 90 +- .../prometheus/common/promlog/log.go | 212 +- .../prometheus/common/version/info.go | 178 +- .../github.com/prometheus/procfs/.gitignore | 2 +- .../prometheus/procfs/.golangci.yml | 12 +- .../prometheus/procfs/CONTRIBUTING.md | 36 +- vendor/github.com/prometheus/procfs/LICENSE | 402 +- .../prometheus/procfs/MAINTAINERS.md | 4 +- vendor/github.com/prometheus/procfs/Makefile | 58 +- .../prometheus/procfs/Makefile.common | 544 +- vendor/github.com/prometheus/procfs/NOTICE | 14 +- vendor/github.com/prometheus/procfs/README.md | 106 +- .../github.com/prometheus/procfs/buddyinfo.go | 170 +- vendor/github.com/prometheus/procfs/doc.go | 90 +- .../prometheus/procfs/fixtures.ttar | 3616 ++-- vendor/github.com/prometheus/procfs/fs.go | 86 +- vendor/github.com/prometheus/procfs/go.mod | 6 +- vendor/github.com/prometheus/procfs/go.sum | 4 +- .../prometheus/procfs/internal/fs/fs.go | 104 +- vendor/github.com/prometheus/procfs/ipvs.go | 478 +- vendor/github.com/prometheus/procfs/mdstat.go | 302 +- .../prometheus/procfs/mountstats.go | 1242 +- .../github.com/prometheus/procfs/net_dev.go | 412 +- .../github.com/prometheus/procfs/net_unix.go | 550 +- vendor/github.com/prometheus/procfs/proc.go | 534 +- .../github.com/prometheus/procfs/proc_io.go | 130 +- .../prometheus/procfs/proc_limits.go | 314 +- .../github.com/prometheus/procfs/proc_ns.go | 136 +- .../github.com/prometheus/procfs/proc_psi.go | 202 +- .../github.com/prometheus/procfs/proc_stat.go | 396 +- .../prometheus/procfs/proc_status.go | 324 +- vendor/github.com/prometheus/procfs/stat.go | 488 +- vendor/github.com/prometheus/procfs/ttar | 826 +- vendor/github.com/prometheus/procfs/xfrm.go | 374 +- vendor/github.com/sirupsen/logrus/.gitignore | 4 +- vendor/github.com/sirupsen/logrus/.travis.yml | 50 +- .../github.com/sirupsen/logrus/CHANGELOG.md | 400 +- vendor/github.com/sirupsen/logrus/LICENSE | 42 +- vendor/github.com/sirupsen/logrus/README.md | 990 +- vendor/github.com/sirupsen/logrus/alt_exit.go | 152 +- vendor/github.com/sirupsen/logrus/doc.go | 52 +- vendor/github.com/sirupsen/logrus/entry.go | 814 +- vendor/github.com/sirupsen/logrus/exported.go | 450 +- .../github.com/sirupsen/logrus/formatter.go | 156 +- vendor/github.com/sirupsen/logrus/go.mod | 20 +- vendor/github.com/sirupsen/logrus/go.sum | 32 +- vendor/github.com/sirupsen/logrus/hooks.go | 68 +- .../sirupsen/logrus/json_formatter.go | 242 +- vendor/github.com/sirupsen/logrus/logger.go | 702 +- vendor/github.com/sirupsen/logrus/logrus.go | 372 +- .../logrus/terminal_check_appengine.go | 22 +- .../sirupsen/logrus/terminal_check_bsd.go | 26 +- .../logrus/terminal_check_no_terminal.go | 22 +- .../logrus/terminal_check_notappengine.go | 34 +- .../sirupsen/logrus/terminal_check_solaris.go | 22 +- .../sirupsen/logrus/terminal_check_unix.go | 26 +- .../sirupsen/logrus/terminal_check_windows.go | 68 +- .../sirupsen/logrus/text_formatter.go | 590 +- vendor/github.com/sirupsen/logrus/writer.go | 128 +- vendor/golang.org/x/sys/AUTHORS | 6 +- vendor/golang.org/x/sys/CONTRIBUTORS | 6 +- vendor/golang.org/x/sys/LICENSE | 54 +- vendor/golang.org/x/sys/PATENTS | 44 +- vendor/golang.org/x/sys/unix/.gitignore | 4 +- vendor/golang.org/x/sys/unix/README.md | 346 +- .../golang.org/x/sys/unix/affinity_linux.go | 248 +- vendor/golang.org/x/sys/unix/aliases.go | 28 +- vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 34 +- vendor/golang.org/x/sys/unix/asm_darwin_386.s | 58 +- .../golang.org/x/sys/unix/asm_darwin_amd64.s | 58 +- vendor/golang.org/x/sys/unix/asm_darwin_arm.s | 60 +- .../golang.org/x/sys/unix/asm_darwin_arm64.s | 60 +- .../x/sys/unix/asm_dragonfly_amd64.s | 58 +- .../golang.org/x/sys/unix/asm_freebsd_386.s | 58 +- .../golang.org/x/sys/unix/asm_freebsd_amd64.s | 58 +- .../golang.org/x/sys/unix/asm_freebsd_arm.s | 58 +- .../golang.org/x/sys/unix/asm_freebsd_arm64.s | 58 +- vendor/golang.org/x/sys/unix/asm_linux_386.s | 130 +- .../golang.org/x/sys/unix/asm_linux_amd64.s | 114 +- vendor/golang.org/x/sys/unix/asm_linux_arm.s | 112 +- .../golang.org/x/sys/unix/asm_linux_arm64.s | 104 +- .../golang.org/x/sys/unix/asm_linux_mips64x.s | 112 +- .../golang.org/x/sys/unix/asm_linux_mipsx.s | 108 +- .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 88 +- .../golang.org/x/sys/unix/asm_linux_s390x.s | 112 +- vendor/golang.org/x/sys/unix/asm_netbsd_386.s | 58 +- .../golang.org/x/sys/unix/asm_netbsd_amd64.s | 58 +- vendor/golang.org/x/sys/unix/asm_netbsd_arm.s | 58 +- .../golang.org/x/sys/unix/asm_netbsd_arm64.s | 58 +- .../golang.org/x/sys/unix/asm_openbsd_386.s | 58 +- .../golang.org/x/sys/unix/asm_openbsd_amd64.s | 58 +- .../golang.org/x/sys/unix/asm_openbsd_arm.s | 58 +- .../golang.org/x/sys/unix/asm_solaris_amd64.s | 34 +- .../golang.org/x/sys/unix/bluetooth_linux.go | 70 +- vendor/golang.org/x/sys/unix/cap_freebsd.go | 390 +- vendor/golang.org/x/sys/unix/constants.go | 26 +- vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 54 +- vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 58 +- vendor/golang.org/x/sys/unix/dev_darwin.go | 48 +- vendor/golang.org/x/sys/unix/dev_dragonfly.go | 60 +- vendor/golang.org/x/sys/unix/dev_freebsd.go | 60 +- vendor/golang.org/x/sys/unix/dev_linux.go | 84 +- vendor/golang.org/x/sys/unix/dev_netbsd.go | 58 +- vendor/golang.org/x/sys/unix/dev_openbsd.go | 58 +- vendor/golang.org/x/sys/unix/dirent.go | 34 +- vendor/golang.org/x/sys/unix/endian_big.go | 18 +- vendor/golang.org/x/sys/unix/endian_little.go | 18 +- vendor/golang.org/x/sys/unix/env_unix.go | 62 +- .../x/sys/unix/errors_freebsd_386.go | 454 +- .../x/sys/unix/errors_freebsd_amd64.go | 454 +- .../x/sys/unix/errors_freebsd_arm.go | 452 +- vendor/golang.org/x/sys/unix/fcntl.go | 64 +- vendor/golang.org/x/sys/unix/fcntl_darwin.go | 36 +- .../x/sys/unix/fcntl_linux_32bit.go | 26 +- vendor/golang.org/x/sys/unix/gccgo.go | 124 +- vendor/golang.org/x/sys/unix/gccgo_c.c | 78 +- .../x/sys/unix/gccgo_linux_amd64.go | 40 +- vendor/golang.org/x/sys/unix/ioctl.go | 60 +- vendor/golang.org/x/sys/unix/mkall.sh | 424 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 1318 +- .../golang.org/x/sys/unix/mksysctl_openbsd.pl | 530 +- .../golang.org/x/sys/unix/openbsd_pledge.go | 332 +- .../golang.org/x/sys/unix/openbsd_unveil.go | 88 +- vendor/golang.org/x/sys/unix/pagesize_unix.go | 30 +- vendor/golang.org/x/sys/unix/race.go | 60 +- vendor/golang.org/x/sys/unix/race0.go | 50 +- .../golang.org/x/sys/unix/sockcmsg_linux.go | 72 +- vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 240 +- vendor/golang.org/x/sys/unix/str.go | 52 +- vendor/golang.org/x/sys/unix/syscall.go | 108 +- vendor/golang.org/x/sys/unix/syscall_aix.go | 1114 +- .../golang.org/x/sys/unix/syscall_aix_ppc.go | 68 +- .../x/sys/unix/syscall_aix_ppc64.go | 68 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 1248 +- .../golang.org/x/sys/unix/syscall_darwin.go | 1412 +- .../x/sys/unix/syscall_darwin_386.go | 126 +- .../x/sys/unix/syscall_darwin_amd64.go | 126 +- .../x/sys/unix/syscall_darwin_arm.go | 128 +- .../x/sys/unix/syscall_darwin_arm64.go | 132 +- .../x/sys/unix/syscall_darwin_libSystem.go | 62 +- .../x/sys/unix/syscall_dragonfly.go | 1078 +- .../x/sys/unix/syscall_dragonfly_amd64.go | 104 +- .../golang.org/x/sys/unix/syscall_freebsd.go | 1648 +- .../x/sys/unix/syscall_freebsd_386.go | 104 +- .../x/sys/unix/syscall_freebsd_amd64.go | 104 +- .../x/sys/unix/syscall_freebsd_arm.go | 104 +- .../x/sys/unix/syscall_freebsd_arm64.go | 104 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 3568 ++-- .../x/sys/unix/syscall_linux_386.go | 772 +- .../x/sys/unix/syscall_linux_amd64.go | 380 +- .../x/sys/unix/syscall_linux_amd64_gc.go | 26 +- .../x/sys/unix/syscall_linux_arm.go | 548 +- .../x/sys/unix/syscall_linux_arm64.go | 446 +- .../golang.org/x/sys/unix/syscall_linux_gc.go | 28 +- .../x/sys/unix/syscall_linux_gc_386.go | 32 +- .../x/sys/unix/syscall_linux_gccgo_386.go | 60 +- .../x/sys/unix/syscall_linux_gccgo_arm.go | 40 +- .../x/sys/unix/syscall_linux_mips64x.go | 444 +- .../x/sys/unix/syscall_linux_mipsx.go | 468 +- .../x/sys/unix/syscall_linux_ppc64x.go | 304 +- .../x/sys/unix/syscall_linux_riscv64.go | 452 +- .../x/sys/unix/syscall_linux_s390x.go | 676 +- .../x/sys/unix/syscall_linux_sparc64.go | 294 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 1244 +- .../x/sys/unix/syscall_netbsd_386.go | 66 +- .../x/sys/unix/syscall_netbsd_amd64.go | 66 +- .../x/sys/unix/syscall_netbsd_arm.go | 66 +- .../x/sys/unix/syscall_netbsd_arm64.go | 66 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 832 +- .../x/sys/unix/syscall_openbsd_386.go | 74 +- .../x/sys/unix/syscall_openbsd_amd64.go | 74 +- .../x/sys/unix/syscall_openbsd_arm.go | 74 +- .../golang.org/x/sys/unix/syscall_solaris.go | 1474 +- .../x/sys/unix/syscall_solaris_amd64.go | 46 +- vendor/golang.org/x/sys/unix/syscall_unix.go | 862 +- .../golang.org/x/sys/unix/syscall_unix_gc.go | 30 +- .../x/sys/unix/syscall_unix_gc_ppc64x.go | 48 +- vendor/golang.org/x/sys/unix/timestruct.go | 164 +- vendor/golang.org/x/sys/unix/xattr_bsd.go | 480 +- .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 2748 ++-- .../x/sys/unix/zerrors_aix_ppc64.go | 2750 ++-- .../x/sys/unix/zerrors_darwin_386.go | 3566 ++-- .../x/sys/unix/zerrors_darwin_amd64.go | 3566 ++-- .../x/sys/unix/zerrors_darwin_arm.go | 3566 ++-- .../x/sys/unix/zerrors_darwin_arm64.go | 3566 ++-- .../x/sys/unix/zerrors_dragonfly_amd64.go | 3300 ++-- .../x/sys/unix/zerrors_freebsd_386.go | 3586 ++-- .../x/sys/unix/zerrors_freebsd_amd64.go | 3588 ++-- .../x/sys/unix/zerrors_freebsd_arm.go | 3604 ++-- .../x/sys/unix/zerrors_freebsd_arm64.go | 3588 ++-- .../x/sys/unix/zerrors_linux_386.go | 5670 +++---- .../x/sys/unix/zerrors_linux_amd64.go | 5670 +++---- .../x/sys/unix/zerrors_linux_arm.go | 5682 +++---- .../x/sys/unix/zerrors_linux_arm64.go | 5652 +++---- .../x/sys/unix/zerrors_linux_mips.go | 5684 +++---- .../x/sys/unix/zerrors_linux_mips64.go | 5684 +++---- .../x/sys/unix/zerrors_linux_mips64le.go | 5684 +++---- .../x/sys/unix/zerrors_linux_mipsle.go | 5684 +++---- .../x/sys/unix/zerrors_linux_ppc64.go | 5794 +++---- .../x/sys/unix/zerrors_linux_ppc64le.go | 5794 +++---- .../x/sys/unix/zerrors_linux_riscv64.go | 5644 +++---- .../x/sys/unix/zerrors_linux_s390x.go | 5790 +++---- .../x/sys/unix/zerrors_linux_sparc64.go | 5782 +++---- .../x/sys/unix/zerrors_netbsd_386.go | 3544 ++-- .../x/sys/unix/zerrors_netbsd_amd64.go | 3524 ++-- .../x/sys/unix/zerrors_netbsd_arm.go | 3502 ++-- .../x/sys/unix/zerrors_netbsd_arm64.go | 3524 ++-- .../x/sys/unix/zerrors_openbsd_386.go | 3308 ++-- .../x/sys/unix/zerrors_openbsd_amd64.go | 3530 ++-- .../x/sys/unix/zerrors_openbsd_arm.go | 3312 ++-- .../x/sys/unix/zerrors_solaris_amd64.go | 3064 ++-- .../golang.org/x/sys/unix/zptrace386_linux.go | 160 +- .../golang.org/x/sys/unix/zptracearm_linux.go | 82 +- .../x/sys/unix/zptracemips_linux.go | 100 +- .../x/sys/unix/zptracemipsle_linux.go | 100 +- .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 2968 ++-- .../x/sys/unix/zsyscall_aix_ppc64.go | 2884 ++-- .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 2384 +-- .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 2140 +-- .../x/sys/unix/zsyscall_darwin_386.1_11.go | 3620 ++-- .../x/sys/unix/zsyscall_darwin_386.go | 5010 +++--- .../x/sys/unix/zsyscall_darwin_386.s | 568 +- .../x/sys/unix/zsyscall_darwin_amd64.1_11.go | 3620 ++-- .../x/sys/unix/zsyscall_darwin_amd64.go | 5040 +++--- .../x/sys/unix/zsyscall_darwin_amd64.s | 572 +- .../x/sys/unix/zsyscall_darwin_arm.1_11.go | 3586 ++-- .../x/sys/unix/zsyscall_darwin_arm.go | 4966 +++--- .../x/sys/unix/zsyscall_darwin_arm.s | 564 +- .../x/sys/unix/zsyscall_darwin_arm64.1_11.go | 3586 ++-- .../x/sys/unix/zsyscall_darwin_arm64.go | 4966 +++--- .../x/sys/unix/zsyscall_darwin_arm64.s | 564 +- .../x/sys/unix/zsyscall_dragonfly_amd64.go | 3318 ++-- .../x/sys/unix/zsyscall_freebsd_386.go | 4030 ++--- .../x/sys/unix/zsyscall_freebsd_amd64.go | 4030 ++--- .../x/sys/unix/zsyscall_freebsd_arm.go | 4030 ++--- .../x/sys/unix/zsyscall_freebsd_arm64.go | 4030 ++--- .../x/sys/unix/zsyscall_linux_386.go | 4492 ++--- .../x/sys/unix/zsyscall_linux_amd64.go | 4826 +++--- .../x/sys/unix/zsyscall_linux_arm.go | 4736 +++--- .../x/sys/unix/zsyscall_linux_arm64.go | 4540 ++--- .../x/sys/unix/zsyscall_linux_mips.go | 4852 +++--- .../x/sys/unix/zsyscall_linux_mips64.go | 4794 +++--- .../x/sys/unix/zsyscall_linux_mips64le.go | 4794 +++--- .../x/sys/unix/zsyscall_linux_mipsle.go | 4852 +++--- .../x/sys/unix/zsyscall_linux_ppc64.go | 4950 +++--- .../x/sys/unix/zsyscall_linux_ppc64le.go | 4950 +++--- .../x/sys/unix/zsyscall_linux_riscv64.go | 4500 ++--- .../x/sys/unix/zsyscall_linux_s390x.go | 4490 ++--- .../x/sys/unix/zsyscall_linux_sparc64.go | 4816 +++--- .../x/sys/unix/zsyscall_netbsd_386.go | 3652 ++-- .../x/sys/unix/zsyscall_netbsd_amd64.go | 3652 ++-- .../x/sys/unix/zsyscall_netbsd_arm.go | 3652 ++-- .../x/sys/unix/zsyscall_netbsd_arm64.go | 3652 ++-- .../x/sys/unix/zsyscall_openbsd_386.go | 3384 ++-- .../x/sys/unix/zsyscall_openbsd_amd64.go | 3384 ++-- .../x/sys/unix/zsyscall_openbsd_arm.go | 3384 ++-- .../x/sys/unix/zsyscall_solaris_amd64.go | 3906 ++--- .../x/sys/unix/zsysctl_openbsd_386.go | 540 +- .../x/sys/unix/zsysctl_openbsd_amd64.go | 540 +- .../x/sys/unix/zsysctl_openbsd_arm.go | 540 +- .../x/sys/unix/zsysnum_darwin_386.go | 872 +- .../x/sys/unix/zsysnum_darwin_amd64.go | 876 +- .../x/sys/unix/zsysnum_darwin_arm.go | 872 +- .../x/sys/unix/zsysnum_darwin_arm64.go | 872 +- .../x/sys/unix/zsysnum_dragonfly_amd64.go | 630 +- .../x/sys/unix/zsysnum_freebsd_386.go | 806 +- .../x/sys/unix/zsysnum_freebsd_amd64.go | 806 +- .../x/sys/unix/zsysnum_freebsd_arm.go | 806 +- .../x/sys/unix/zsysnum_freebsd_arm64.go | 790 +- .../x/sys/unix/zsysnum_linux_386.go | 784 +- .../x/sys/unix/zsysnum_linux_amd64.go | 688 +- .../x/sys/unix/zsysnum_linux_arm.go | 728 +- .../x/sys/unix/zsysnum_linux_arm64.go | 578 +- .../x/sys/unix/zsysnum_linux_mips.go | 754 +- .../x/sys/unix/zsysnum_linux_mips64.go | 674 +- .../x/sys/unix/zsysnum_linux_mips64le.go | 674 +- .../x/sys/unix/zsysnum_linux_mipsle.go | 754 +- .../x/sys/unix/zsysnum_linux_ppc64.go | 750 +- .../x/sys/unix/zsysnum_linux_ppc64le.go | 750 +- .../x/sys/unix/zsysnum_linux_riscv64.go | 576 +- .../x/sys/unix/zsysnum_linux_s390x.go | 674 +- .../x/sys/unix/zsysnum_linux_sparc64.go | 702 +- .../x/sys/unix/zsysnum_netbsd_386.go | 548 +- .../x/sys/unix/zsysnum_netbsd_amd64.go | 548 +- .../x/sys/unix/zsysnum_netbsd_arm.go | 548 +- .../x/sys/unix/zsysnum_netbsd_arm64.go | 548 +- .../x/sys/unix/zsysnum_openbsd_386.go | 436 +- .../x/sys/unix/zsysnum_openbsd_amd64.go | 436 +- .../x/sys/unix/zsysnum_openbsd_arm.go | 436 +- .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 690 +- .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 700 +- .../x/sys/unix/ztypes_darwin_386.go | 998 +- .../x/sys/unix/ztypes_darwin_amd64.go | 1018 +- .../x/sys/unix/ztypes_darwin_arm.go | 1000 +- .../x/sys/unix/ztypes_darwin_arm64.go | 1018 +- .../x/sys/unix/ztypes_dragonfly_amd64.go | 938 +- .../x/sys/unix/ztypes_freebsd_386.go | 1206 +- .../x/sys/unix/ztypes_freebsd_amd64.go | 1204 +- .../x/sys/unix/ztypes_freebsd_arm.go | 1204 +- .../x/sys/unix/ztypes_freebsd_arm64.go | 1204 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 4270 ++--- .../x/sys/unix/ztypes_linux_amd64.go | 4296 ++--- .../golang.org/x/sys/unix/ztypes_linux_arm.go | 4252 ++--- .../x/sys/unix/ztypes_linux_arm64.go | 4254 ++--- .../x/sys/unix/ztypes_linux_mips.go | 4264 ++--- .../x/sys/unix/ztypes_linux_mips64.go | 4258 ++--- .../x/sys/unix/ztypes_linux_mips64le.go | 4258 ++--- .../x/sys/unix/ztypes_linux_mipsle.go | 4264 ++--- .../x/sys/unix/ztypes_linux_ppc64.go | 4274 ++--- .../x/sys/unix/ztypes_linux_ppc64le.go | 4274 ++--- .../x/sys/unix/ztypes_linux_riscv64.go | 4308 ++--- .../x/sys/unix/ztypes_linux_s390x.go | 4302 ++--- .../x/sys/unix/ztypes_linux_sparc64.go | 4264 ++--- .../x/sys/unix/ztypes_netbsd_386.go | 930 +- .../x/sys/unix/ztypes_netbsd_amd64.go | 944 +- .../x/sys/unix/ztypes_netbsd_arm.go | 940 +- .../x/sys/unix/ztypes_netbsd_arm64.go | 944 +- .../x/sys/unix/ztypes_openbsd_386.go | 1140 +- .../x/sys/unix/ztypes_openbsd_amd64.go | 1140 +- .../x/sys/unix/ztypes_openbsd_arm.go | 1142 +- .../x/sys/unix/ztypes_solaris_amd64.go | 884 +- vendor/golang.org/x/sys/windows/aliases.go | 26 +- .../x/sys/windows/asm_windows_386.s | 26 +- .../x/sys/windows/asm_windows_amd64.s | 26 +- .../x/sys/windows/asm_windows_arm.s | 22 +- .../golang.org/x/sys/windows/dll_windows.go | 756 +- .../golang.org/x/sys/windows/env_windows.go | 58 +- vendor/golang.org/x/sys/windows/eventlog.go | 40 +- .../golang.org/x/sys/windows/exec_windows.go | 194 +- .../x/sys/windows/memory_windows.go | 52 +- vendor/golang.org/x/sys/windows/mkerrors.bash | 128 +- vendor/golang.org/x/sys/windows/mkerrors.go | 14 +- vendor/golang.org/x/sys/windows/mksyscall.go | 14 +- vendor/golang.org/x/sys/windows/race.go | 60 +- vendor/golang.org/x/sys/windows/race0.go | 50 +- .../golang.org/x/sys/windows/registry/key.go | 396 +- .../x/sys/windows/registry/mksyscall.go | 14 +- .../x/sys/windows/registry/syscall.go | 64 +- .../x/sys/windows/registry/value.go | 768 +- .../sys/windows/registry/zsyscall_windows.go | 240 +- .../x/sys/windows/security_windows.go | 1298 +- vendor/golang.org/x/sys/windows/service.go | 362 +- vendor/golang.org/x/sys/windows/str.go | 44 +- .../x/sys/windows/svc/eventlog/install.go | 160 +- .../x/sys/windows/svc/eventlog/log.go | 140 +- vendor/golang.org/x/sys/windows/syscall.go | 148 +- .../x/sys/windows/syscall_windows.go | 2440 +-- .../golang.org/x/sys/windows/types_windows.go | 2882 ++-- .../x/sys/windows/types_windows_386.go | 44 +- .../x/sys/windows/types_windows_amd64.go | 44 +- .../x/sys/windows/types_windows_arm.go | 44 +- .../x/sys/windows/zerrors_windows.go | 13706 ++++++++-------- .../x/sys/windows/zsyscall_windows.go | 5558 +++---- .../alecthomas/kingpin.v2/.travis.yml | 8 +- vendor/gopkg.in/alecthomas/kingpin.v2/COPYING | 38 +- .../gopkg.in/alecthomas/kingpin.v2/README.md | 1348 +- .../gopkg.in/alecthomas/kingpin.v2/actions.go | 84 +- vendor/gopkg.in/alecthomas/kingpin.v2/app.go | 1376 +- vendor/gopkg.in/alecthomas/kingpin.v2/args.go | 368 +- vendor/gopkg.in/alecthomas/kingpin.v2/cmd.go | 548 +- .../alecthomas/kingpin.v2/completions.go | 66 +- vendor/gopkg.in/alecthomas/kingpin.v2/doc.go | 136 +- .../gopkg.in/alecthomas/kingpin.v2/envar.go | 90 +- .../gopkg.in/alecthomas/kingpin.v2/flags.go | 616 +- .../gopkg.in/alecthomas/kingpin.v2/global.go | 188 +- .../alecthomas/kingpin.v2/guesswidth.go | 18 +- .../alecthomas/kingpin.v2/guesswidth_unix.go | 76 +- .../gopkg.in/alecthomas/kingpin.v2/model.go | 454 +- .../gopkg.in/alecthomas/kingpin.v2/parser.go | 792 +- .../gopkg.in/alecthomas/kingpin.v2/parsers.go | 424 +- .../alecthomas/kingpin.v2/templates.go | 524 +- .../gopkg.in/alecthomas/kingpin.v2/usage.go | 422 +- .../gopkg.in/alecthomas/kingpin.v2/values.go | 940 +- .../alecthomas/kingpin.v2/values.json | 50 +- .../alecthomas/kingpin.v2/values_generated.go | 1642 +- vendor/gopkg.in/yaml.v2/.travis.yml | 24 +- vendor/gopkg.in/yaml.v2/LICENSE | 402 +- vendor/gopkg.in/yaml.v2/LICENSE.libyaml | 62 +- vendor/gopkg.in/yaml.v2/NOTICE | 26 +- vendor/gopkg.in/yaml.v2/README.md | 266 +- vendor/gopkg.in/yaml.v2/apic.go | 1478 +- vendor/gopkg.in/yaml.v2/decode.go | 1550 +- vendor/gopkg.in/yaml.v2/emitterc.go | 3370 ++-- vendor/gopkg.in/yaml.v2/encode.go | 780 +- vendor/gopkg.in/yaml.v2/go.mod | 10 +- vendor/gopkg.in/yaml.v2/parserc.go | 2190 +-- vendor/gopkg.in/yaml.v2/readerc.go | 824 +- vendor/gopkg.in/yaml.v2/resolve.go | 516 +- vendor/gopkg.in/yaml.v2/scannerc.go | 5392 +++--- vendor/gopkg.in/yaml.v2/sorter.go | 226 +- vendor/gopkg.in/yaml.v2/writerc.go | 52 +- vendor/gopkg.in/yaml.v2/yaml.go | 932 +- vendor/gopkg.in/yaml.v2/yamlh.go | 1476 +- vendor/gopkg.in/yaml.v2/yamlprivateh.go | 346 +- vendor/modules.txt | 106 +- 602 files changed, 296670 insertions(+), 294114 deletions(-) create mode 100644 pkg/event.go~ create mode 100644 pkg/event/event.go create mode 100644 pkg/event/event.go~ create mode 100644 pkg/exporter/exporter.go create mode 100644 pkg/exporter/exporter.go~ create mode 100644 pkg/line/line.go create mode 100644 pkg/line/line.go~ create mode 100644 pkg/listener/listener.go create mode 100644 pkg/listener/listener.go~ create mode 100644 pkg/metrics/metrics.go create mode 100644 pkg/metrics/metrics.go~ create mode 100644 pkg/registry/registry.go create mode 100644 pkg/registry/registry.go~ create mode 100644 pkg/util/util.go create mode 100644 pkg/util/util.go~ create mode 100644 statsd_exporter.exe diff --git a/CHANGELOG.md b/CHANGELOG.md index ba6b224..73cbf95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,286 +1,286 @@ -## 0.15.0 / 2020-03-05 - -* [ENHANCEMENT] Allow setting granularity for summary metrics ([#290](https://github.com/prometheus/statsd_exporter/pull/290)) -* [ENHANCEMENT] Support a random-replacement cache invalidation strategy ([#281](https://github.com/prometheus/statsd_exporter/pull/281) - -To facilitate the expanded settings for summaries, the configuration format changes from - -```yaml -mappings: -- match: … - timer_type: summary - quantiles: - - quantile: 0.99 - error: 0.001 - - quantile: 0.95 - error: 0.01 - … -``` - -to - -```yaml -mappings: -- match: … - timer_type: summary - summary_options: - quantiles: - - quantile: 0.99 - error: 0.001 - - quantile: 0.95 - error: 0.01 - … - max_summary_age: 30s - summary_age_buckets: 3 - stream_buffer_size: 1000 - … -``` - -For consistency, the format for histogram buckets also changes from - -```yaml -mappings: -- match: … - timer_type: histogram - buckets: [ 0.01, 0.025, 0.05, 0.1 ] -``` - -to - -```yaml -mappings: -- match: … - timer_type: histogram - histogram_options: - buckets: [ 0.01, 0.025, 0.05, 0.1 ] -``` - -Transitionally, the old format will still work but is *deprecated*. The new -settings are optional. - -For users of the [mapper](https://pkg.go.dev/github.com/prometheus/statsd_exporter/pkg/mapper?tab=doc) -as a library, this is a breaking change. To adjust your code, replace -`mapping.Buckets` with `mapping.HistogramOptions.Buckets` and -`mapping.Quantiles` with `mapping.SummaryOptions.Quantiles`. - -## 0.14.1 / 2020-01-13 - -* [BUGFIX] Mapper cache poisoning when name is variable ([#286](https://github.com/prometheus/statsd_exporter/pull/286)) -* [BUGFIX] nil pointer dereference in UDP listener ([#287](https://github.com/prometheus/statsd_exporter/pull/287)) - -Thank you to everyone who reported these, and @bakins for the mapper cache fix! - -## 0.14.0 / 2020-01-10 - -* [CHANGE] Switch logging to go-kit ([#283](https://github.com/prometheus/statsd_exporter/pull/283)) -* [CHANGE] Rename existing metric for mapping cache size ([#284](https://github.com/prometheus/statsd_exporter/pull/284)) -* [ENHANCEMENT] Add metrics for mapping cache hits ([#280](https://github.com/prometheus/statsd_exporter/pull/280)) - -Logs are more structured now. The `fatal` log level no longer exists; use `--log.level=error` instead. The valid log formats are `logfmt` and `json`. - -The metric `statsd_exporter_cache_length` is now called `statsd_metric_mapper_cache_length`. - -## 0.13.0 / 2019-12-06 - -* [ENHANCEMENT] Support sampling factors for all statsd metric types ([#264](https://github.com/prometheus/statsd_exporter/issues/250)) -* [ENHANCEMENT] Support Librato and InfluxDB labeling formats ([#267](https://github.com/prometheus/statsd_exporter/pull/267)) - -## 0.12.2 / 2019-07-25 - -* [BUGFIX] Fix Unix socket handler ([#252](https://github.com/prometheus/statsd_exporter/pull/252)) -* [BUGFIX] Fix panic under high load ([#253](https://github.com/prometheus/statsd_exporter/pull/253)) - -Thank you to everyone who reported and helped debug these issues! - -## 0.12.1 / 2019-07-08 - -* [BUGFIX] Renew TTL when a metric receives updates ([#246](https://github.com/prometheus/statsd_exporter/pull/246)) -* [CHANGE] Reload on SIGHUP instead of watching the file ([#243](https://github.com/prometheus/statsd_exporter/pull/243)) - -## 0.11.2 / 2019-06-14 - -* [BUGFIX] Fix TCP handler ([#235](https://github.com/prometheus/statsd_exporter/pull/235)) - -## 0.11.1 / 2019-06-14 - -* [ENHANCEMENT] Batch event processing for improved ingestion performance ([#227](https://github.com/prometheus/statsd_exporter/pull/227)) -* [ENHANCEMENT] Switch Prometheus client to promhttp, freeing the standard HTTP metrics ([#233](https://github.com/prometheus/statsd_exporter/pull/233)) - -With #233, the exporter no longer exports metrics about its own HTTP status. These were not helpful since you could not get them when scraping fails. This allows mapping to metric names like `http_requests_total` that are useful as application metrics. - -## 0.10.6 / 2019-06-07 - -* [BUGFIX] Fix mapping collision for metrics with different types, but the same name ([#229](https://github.com/prometheus/statsd_exporter/pull/229)) - -## 0.10.5 / 2019-05-27 - -* [BUGFIX] Fix "Error: inconsistent label cardinality: expected 0 label values but got N in prometheus.Labels" ([#224](https://github.com/prometheus/statsd_exporter/pull/224)) - -## 0.10.4 / 2019-05-20 - -* [BUGFIX] Revert #218 due to a race condition ([#221](https://github.com/prometheus/statsd_exporter/pull/221)) - -## 0.10.3 / 2019-05-17 - -* [ENHANCEMENT] Reduce allocations when escaping metric names ([#217](https://github.com/prometheus/statsd_exporter/pull/217)) -* [ENHANCEMENT] Reduce allocations when handling packets ([#218](https://github.com/prometheus/statsd_exporter/pull/218)) -* [ENHANCEMENT] Optimize label sorting ([#219](https://github.com/prometheus/statsd_exporter/pull/219)) - -This release is entirely powered by @claytono. Kudos! - -## 0.10.2 / 2019-05-17 - -* [CHANGE] Do not run as root in the Docker container by default ([#202](https://github.com/prometheus/statsd_exporter/pull/202)) -* [FEATURE] Add metric for count of events by action ([#193](https://github.com/prometheus/statsd_exporter/pull/193)) -* [FEATURE] Add metric for count of distinct metric names ([#200](https://github.com/prometheus/statsd_exporter/pull/200)) -* [FEATURE] Add UNIX socket listener support ([#199](https://github.com/prometheus/statsd_exporter/pull/199)) -* [FEATURE] Accept Datadog [distributions](https://docs.datadoghq.com/graphing/metrics/distributions/) ([#211](https://github.com/prometheus/statsd_exporter/pull/211)) -* [ENHANCEMENT] Add a health check to the Docker container ([#182](https://github.com/prometheus/statsd_exporter/pull/182)) -* [ENHANCEMENT] Allow inconsistent label sets ([#194](https://github.com/prometheus/statsd_exporter/pull/194)) -* [ENHANCEMENT] Speed up sanitization of metric names ([#197](https://github.com/prometheus/statsd_exporter/pull/197)) -* [ENHANCEMENT] Enable pprof endpoints ([#205](https://github.com/prometheus/statsd_exporter/pull/205)) -* [ENHANCEMENT] DogStatsD tag parsing is faster ([#210](https://github.com/prometheus/statsd_exporter/pull/210)) -* [ENHANCEMENT] Cache mapped metrics ([#198](https://github.com/prometheus/statsd_exporter/pull/198)) -* [BUGFIX] Fix panic if a mapping resulted in an empty name ([#192](https://github.com/prometheus/statsd_exporter/pull/192)) -* [BUGFIX] Ensure that there are always default quantiles if using summaries ([#212](https://github.com/prometheus/statsd_exporter/pull/212)) -* [BUGFIX] Prevent ingesting conflicting metric types that would make scraping fail ([#213](https://github.com/prometheus/statsd_exporter/pull/213)) - -With #192, the count of events rejected because of negative counter increments has moved into the `statsd_exporter_events_error_total` metric, instead of being lumped in with the different kinds of successful events. - -## 0.9.0 / 2019-03-11 - -* [ENHANCEMENT] Update the Prometheus client library to 0.9.2 ([#171](https://github.com/prometheus/statsd_exporter/pull/171)) -* [FEATURE] Metrics can now be expired with a per-mapping TTL ([#164](https://github.com/prometheus/statsd_exporter/pull/164)) -* [CHANGE] Timers that mapped to a summary are scaled to seconds, just like histograms ([#178](https://github.com/prometheus/statsd_exporter/pull/178)) - -If you are using summaries, all your quantiles and `_total` will change by a factor of 1000. -Adjust your queries and dashboards, or consider switching to histograms altogether. - -## 0.8.1 / 2018-12-05 - -* [BUGFIX] Expose the counter for unmapped matches ([#161](https://github.com/prometheus/statsd_exporter/pull/161)) -* [BUGFIX] Unsuccessful backtracking does not clobber captures ([#169](https://github.com/prometheus/statsd_exporter/pull/169), fixes [#168](https://github.com/prometheus/statsd_exporter/issues/168)) - -## 0.8.0 / 2018-10-12 - -* [ENHANCEMENT] Speed up glob matching ([#157](https://github.com/prometheus/statsd_exporter/pull/157)) - -This release replaces the implementation of the glob matching mechanism, -speeding it up significantly. In certain sub-optimal configurations, a warning -is logged. - -This major enhancement was contributed by [Wangchong Zhou](https://github.com/fffonion). - -## 0.7.0 / 2018-08-22 - -This is a breaking release, but the migration is easy: command line flags now -require two dashes (`--help` instead of `-help`). The previous flag library -already accepts this form, so if necessary you can migrate the flags first -before upgrading. - -The deprecated `--statsd.listen-address` flag has been removed, use -`--statsd.listen-udp` instead. - -* [CHANGE] Switch to Kingpin for flags, fixes setting log level ([#141](https://github.com/prometheus/statsd_exporter/pull/141)) -* [ENHANCEMENT] Allow matching on specific metric types ([#136](https://github.com/prometheus/statsd_exporter/pulls/136)) -* [ENHANCEMENT] Summary quantiles can be configured ([#135](https://github.com/prometheus/statsd_exporter/pulls/135)) -* [BUGFIX] Fix panic if an invalid regular expression is supplied ([#126](https://github.com/prometheus/statsd_exporter/pulls/126)) - -## 0.6.0 / 2018-01-17 - -* [ENHANCEMENT] Add a drop action ([#115](https://github.com/prometheus/statsd_exporter/pulls/115)) -* [ENHANCEMENT] Allow templating metric names ([#117](https://github.com/prometheus/statsd_exporter/pulls/117)) - -## 0.5.0 / 2017-11-16 - -NOTE: This release breaks backward compatibility. `statsd_exporter` now uses -a YAML configuration file. You must convert your mappings configuration to -the new format when you upgrade. For example, the configuration - -``` -test.dispatcher.*.*.* -name="dispatcher_events_total" -processor="$1" -action="$2" -outcome="$3" -job="test_dispatcher" - -*.signup.*.* -name="signup_events_total" -provider="$2" -outcome="$3" -job="${1}_server" -``` - -now has the format - -```yaml -mappings: -- match: test.dispatcher.*.*.* - help: "The total number of events handled by the dispatcher." - name: "dispatcher_events_total" - labels: - processor: "$1" - action: "$2" - outcome: "$3" - job: "test_dispatcher" -- match: *.signup.*.* - name: "signup_events_total" - help: "The total number of signup events." - labels: - provider: "$2" - outcome: "$3" - job: "${1}_server" -``` - -The help field is optional. - -There is a [tool](https://github.com/bakins/statsd-exporter-convert) available to help with this conversion. - -* [CHANGE] Replace the overloaded "packets" metric ([#106](https://github.com/prometheus/statsd_exporter/pulls/106)) -* [CHANGE] Removed `-statsd.add-suffix` option flag [#99](https://github.com/prometheus/statsd_exporter/pulls/99). Users should remove - this flag when upgrading. Metrics will no longer automatically include the - suffixes `_timer` or `counter`. You may need to adjust any graphs that used - metrics with these suffixes. -* [CHANGE] Reduce log levels [#92](https://github.com/prometheus/statsd_exporter/pulls/92). Many log events have been changed from error - to debug log level. -* [CHANGE] Use YAML for configuration file [#66](https://github.com/prometheus/statsd_exporter/pulls/66). See note above about file format - conversion. -* [ENHANCEMENT] Allow help text to be customized [#87](https://github.com/prometheus/statsd_exporter/pulls/87) -* [ENHANCEMENT] Add support for regex mappers [#85](https://github.com/prometheus/statsd_exporter/pulls/85) -* [ENHANCEMENT] Add TCP listener support [#71](https://github.com/prometheus/statsd_exporter/pulls/71) -* [ENHANCEMENT] Allow histograms for timer metrics [#66](https://github.com/prometheus/statsd_exporter/pulls/66) -* [ENHANCEMENT] Added support for sampling factor on timing events [#28](https://github.com/prometheus/statsd_exporter/pulls/28) -* [BUGFIX] Conflicting label sets no longer crash the exporter and will be - ignored. Restart to clear the remembered label set. [#72](https://github.com/prometheus/statsd_exporter/pulls/72) - -## 0.4.0 / 2017-05-12 - -* [ENHANCEMENT] Improve mapping configuration parser [#61](https://github.com/prometheus/statsd_exporter/pulls/61) -* [ENHANCEMENT] Add increment/decrement support to Gauges [#65](https://github.com/prometheus/statsd_exporter/pulls/65) -* [BUGFIX] Tolerate more forms of broken lines from StatsD [#48](https://github.com/prometheus/statsd_exporter/pulls/48) -* [BUGFIX] Skip metrics with invalid utf8 [#50](https://github.com/prometheus/statsd_exporter/pulls/50) -* [BUGFIX] ListenAndServe now fails on exit [#58](https://github.com/prometheus/statsd_exporter/pulls/58) - -## 0.3.0 / 2016-05-05 - -* [CHANGE] Drop `_count` suffix for `loaded_mappings` metric ([#41](https://github.com/prometheus/statsd_exporter/pulls/41)) -* [ENHANCEMENT] Use common's log and version packages, and add -version flag ([#44](https://github.com/prometheus/statsd_exporter/pulls/44)) -* [ENHANCEMENT] Add flag to disable metric type suffixes ([#37](https://github.com/prometheus/statsd_exporter/pulls/37)) -* [BUGFIX] Increase receivable UDP datagram size to 65535 bytes ([#36](https://github.com/prometheus/statsd_exporter/pulls/36)) -* [BUGFIX] Warn, not panic when negative number counter is submitted ([#33](https://github.com/prometheus/statsd_exporter/pulls/33)) - -## 0.2.0 / 2016-03-19 - -NOTE: This release renames `statsd_bridge` to `statsd_exporter` - -* [CHANGE] New Dockerfile using alpine-golang-make-onbuild base image ([#17](https://github.com/prometheus/statsd_exporter/pulls/17)) -* [ENHANCEMENT] Allow configuration of UDP read buffer ([#22](https://github.com/prometheus/statsd_exporter/pulls/22)) -* [BUGFIX] allow metrics with dashes when mapping ([#24](https://github.com/prometheus/statsd_exporter/pulls/24)) -* [ENHANCEMENT] add root endpoint with redirect ([#25](https://github.com/prometheus/statsd_exporter/pulls/25)) -* [CHANGE] rename bridge to exporter ([#26](https://github.com/prometheus/statsd_exporter/pulls/26)) - - -## 0.1.0 / 2015-04-17 - -* Initial release +## 0.15.0 / 2020-03-05 + +* [ENHANCEMENT] Allow setting granularity for summary metrics ([#290](https://github.com/prometheus/statsd_exporter/pull/290)) +* [ENHANCEMENT] Support a random-replacement cache invalidation strategy ([#281](https://github.com/prometheus/statsd_exporter/pull/281) + +To facilitate the expanded settings for summaries, the configuration format changes from + +```yaml +mappings: +- match: … + timer_type: summary + quantiles: + - quantile: 0.99 + error: 0.001 + - quantile: 0.95 + error: 0.01 + … +``` + +to + +```yaml +mappings: +- match: … + timer_type: summary + summary_options: + quantiles: + - quantile: 0.99 + error: 0.001 + - quantile: 0.95 + error: 0.01 + … + max_summary_age: 30s + summary_age_buckets: 3 + stream_buffer_size: 1000 + … +``` + +For consistency, the format for histogram buckets also changes from + +```yaml +mappings: +- match: … + timer_type: histogram + buckets: [ 0.01, 0.025, 0.05, 0.1 ] +``` + +to + +```yaml +mappings: +- match: … + timer_type: histogram + histogram_options: + buckets: [ 0.01, 0.025, 0.05, 0.1 ] +``` + +Transitionally, the old format will still work but is *deprecated*. The new +settings are optional. + +For users of the [mapper](https://pkg.go.dev/github.com/prometheus/statsd_exporter/pkg/mapper?tab=doc) +as a library, this is a breaking change. To adjust your code, replace +`mapping.Buckets` with `mapping.HistogramOptions.Buckets` and +`mapping.Quantiles` with `mapping.SummaryOptions.Quantiles`. + +## 0.14.1 / 2020-01-13 + +* [BUGFIX] Mapper cache poisoning when name is variable ([#286](https://github.com/prometheus/statsd_exporter/pull/286)) +* [BUGFIX] nil pointer dereference in UDP listener ([#287](https://github.com/prometheus/statsd_exporter/pull/287)) + +Thank you to everyone who reported these, and @bakins for the mapper cache fix! + +## 0.14.0 / 2020-01-10 + +* [CHANGE] Switch logging to go-kit ([#283](https://github.com/prometheus/statsd_exporter/pull/283)) +* [CHANGE] Rename existing metric for mapping cache size ([#284](https://github.com/prometheus/statsd_exporter/pull/284)) +* [ENHANCEMENT] Add metrics for mapping cache hits ([#280](https://github.com/prometheus/statsd_exporter/pull/280)) + +Logs are more structured now. The `fatal` log level no longer exists; use `--log.level=error` instead. The valid log formats are `logfmt` and `json`. + +The metric `statsd_exporter_cache_length` is now called `statsd_metric_mapper_cache_length`. + +## 0.13.0 / 2019-12-06 + +* [ENHANCEMENT] Support sampling factors for all statsd metric types ([#264](https://github.com/prometheus/statsd_exporter/issues/250)) +* [ENHANCEMENT] Support Librato and InfluxDB labeling formats ([#267](https://github.com/prometheus/statsd_exporter/pull/267)) + +## 0.12.2 / 2019-07-25 + +* [BUGFIX] Fix Unix socket handler ([#252](https://github.com/prometheus/statsd_exporter/pull/252)) +* [BUGFIX] Fix panic under high load ([#253](https://github.com/prometheus/statsd_exporter/pull/253)) + +Thank you to everyone who reported and helped debug these issues! + +## 0.12.1 / 2019-07-08 + +* [BUGFIX] Renew TTL when a metric receives updates ([#246](https://github.com/prometheus/statsd_exporter/pull/246)) +* [CHANGE] Reload on SIGHUP instead of watching the file ([#243](https://github.com/prometheus/statsd_exporter/pull/243)) + +## 0.11.2 / 2019-06-14 + +* [BUGFIX] Fix TCP handler ([#235](https://github.com/prometheus/statsd_exporter/pull/235)) + +## 0.11.1 / 2019-06-14 + +* [ENHANCEMENT] Batch event processing for improved ingestion performance ([#227](https://github.com/prometheus/statsd_exporter/pull/227)) +* [ENHANCEMENT] Switch Prometheus client to promhttp, freeing the standard HTTP metrics ([#233](https://github.com/prometheus/statsd_exporter/pull/233)) + +With #233, the exporter no longer exports metrics about its own HTTP status. These were not helpful since you could not get them when scraping fails. This allows mapping to metric names like `http_requests_total` that are useful as application metrics. + +## 0.10.6 / 2019-06-07 + +* [BUGFIX] Fix mapping collision for metrics with different types, but the same name ([#229](https://github.com/prometheus/statsd_exporter/pull/229)) + +## 0.10.5 / 2019-05-27 + +* [BUGFIX] Fix "Error: inconsistent label cardinality: expected 0 label values but got N in prometheus.Labels" ([#224](https://github.com/prometheus/statsd_exporter/pull/224)) + +## 0.10.4 / 2019-05-20 + +* [BUGFIX] Revert #218 due to a race condition ([#221](https://github.com/prometheus/statsd_exporter/pull/221)) + +## 0.10.3 / 2019-05-17 + +* [ENHANCEMENT] Reduce allocations when escaping metric names ([#217](https://github.com/prometheus/statsd_exporter/pull/217)) +* [ENHANCEMENT] Reduce allocations when handling packets ([#218](https://github.com/prometheus/statsd_exporter/pull/218)) +* [ENHANCEMENT] Optimize label sorting ([#219](https://github.com/prometheus/statsd_exporter/pull/219)) + +This release is entirely powered by @claytono. Kudos! + +## 0.10.2 / 2019-05-17 + +* [CHANGE] Do not run as root in the Docker container by default ([#202](https://github.com/prometheus/statsd_exporter/pull/202)) +* [FEATURE] Add metric for count of events by action ([#193](https://github.com/prometheus/statsd_exporter/pull/193)) +* [FEATURE] Add metric for count of distinct metric names ([#200](https://github.com/prometheus/statsd_exporter/pull/200)) +* [FEATURE] Add UNIX socket listener support ([#199](https://github.com/prometheus/statsd_exporter/pull/199)) +* [FEATURE] Accept Datadog [distributions](https://docs.datadoghq.com/graphing/metrics/distributions/) ([#211](https://github.com/prometheus/statsd_exporter/pull/211)) +* [ENHANCEMENT] Add a health check to the Docker container ([#182](https://github.com/prometheus/statsd_exporter/pull/182)) +* [ENHANCEMENT] Allow inconsistent label sets ([#194](https://github.com/prometheus/statsd_exporter/pull/194)) +* [ENHANCEMENT] Speed up sanitization of metric names ([#197](https://github.com/prometheus/statsd_exporter/pull/197)) +* [ENHANCEMENT] Enable pprof endpoints ([#205](https://github.com/prometheus/statsd_exporter/pull/205)) +* [ENHANCEMENT] DogStatsD tag parsing is faster ([#210](https://github.com/prometheus/statsd_exporter/pull/210)) +* [ENHANCEMENT] Cache mapped metrics ([#198](https://github.com/prometheus/statsd_exporter/pull/198)) +* [BUGFIX] Fix panic if a mapping resulted in an empty name ([#192](https://github.com/prometheus/statsd_exporter/pull/192)) +* [BUGFIX] Ensure that there are always default quantiles if using summaries ([#212](https://github.com/prometheus/statsd_exporter/pull/212)) +* [BUGFIX] Prevent ingesting conflicting metric types that would make scraping fail ([#213](https://github.com/prometheus/statsd_exporter/pull/213)) + +With #192, the count of events rejected because of negative counter increments has moved into the `statsd_exporter_events_error_total` metric, instead of being lumped in with the different kinds of successful events. + +## 0.9.0 / 2019-03-11 + +* [ENHANCEMENT] Update the Prometheus client library to 0.9.2 ([#171](https://github.com/prometheus/statsd_exporter/pull/171)) +* [FEATURE] Metrics can now be expired with a per-mapping TTL ([#164](https://github.com/prometheus/statsd_exporter/pull/164)) +* [CHANGE] Timers that mapped to a summary are scaled to seconds, just like histograms ([#178](https://github.com/prometheus/statsd_exporter/pull/178)) + +If you are using summaries, all your quantiles and `_total` will change by a factor of 1000. +Adjust your queries and dashboards, or consider switching to histograms altogether. + +## 0.8.1 / 2018-12-05 + +* [BUGFIX] Expose the counter for unmapped matches ([#161](https://github.com/prometheus/statsd_exporter/pull/161)) +* [BUGFIX] Unsuccessful backtracking does not clobber captures ([#169](https://github.com/prometheus/statsd_exporter/pull/169), fixes [#168](https://github.com/prometheus/statsd_exporter/issues/168)) + +## 0.8.0 / 2018-10-12 + +* [ENHANCEMENT] Speed up glob matching ([#157](https://github.com/prometheus/statsd_exporter/pull/157)) + +This release replaces the implementation of the glob matching mechanism, +speeding it up significantly. In certain sub-optimal configurations, a warning +is logged. + +This major enhancement was contributed by [Wangchong Zhou](https://github.com/fffonion). + +## 0.7.0 / 2018-08-22 + +This is a breaking release, but the migration is easy: command line flags now +require two dashes (`--help` instead of `-help`). The previous flag library +already accepts this form, so if necessary you can migrate the flags first +before upgrading. + +The deprecated `--statsd.listen-address` flag has been removed, use +`--statsd.listen-udp` instead. + +* [CHANGE] Switch to Kingpin for flags, fixes setting log level ([#141](https://github.com/prometheus/statsd_exporter/pull/141)) +* [ENHANCEMENT] Allow matching on specific metric types ([#136](https://github.com/prometheus/statsd_exporter/pulls/136)) +* [ENHANCEMENT] Summary quantiles can be configured ([#135](https://github.com/prometheus/statsd_exporter/pulls/135)) +* [BUGFIX] Fix panic if an invalid regular expression is supplied ([#126](https://github.com/prometheus/statsd_exporter/pulls/126)) + +## 0.6.0 / 2018-01-17 + +* [ENHANCEMENT] Add a drop action ([#115](https://github.com/prometheus/statsd_exporter/pulls/115)) +* [ENHANCEMENT] Allow templating metric names ([#117](https://github.com/prometheus/statsd_exporter/pulls/117)) + +## 0.5.0 / 2017-11-16 + +NOTE: This release breaks backward compatibility. `statsd_exporter` now uses +a YAML configuration file. You must convert your mappings configuration to +the new format when you upgrade. For example, the configuration + +``` +test.dispatcher.*.*.* +name="dispatcher_events_total" +processor="$1" +action="$2" +outcome="$3" +job="test_dispatcher" + +*.signup.*.* +name="signup_events_total" +provider="$2" +outcome="$3" +job="${1}_server" +``` + +now has the format + +```yaml +mappings: +- match: test.dispatcher.*.*.* + help: "The total number of events handled by the dispatcher." + name: "dispatcher_events_total" + labels: + processor: "$1" + action: "$2" + outcome: "$3" + job: "test_dispatcher" +- match: *.signup.*.* + name: "signup_events_total" + help: "The total number of signup events." + labels: + provider: "$2" + outcome: "$3" + job: "${1}_server" +``` + +The help field is optional. + +There is a [tool](https://github.com/bakins/statsd-exporter-convert) available to help with this conversion. + +* [CHANGE] Replace the overloaded "packets" metric ([#106](https://github.com/prometheus/statsd_exporter/pulls/106)) +* [CHANGE] Removed `-statsd.add-suffix` option flag [#99](https://github.com/prometheus/statsd_exporter/pulls/99). Users should remove + this flag when upgrading. Metrics will no longer automatically include the + suffixes `_timer` or `counter`. You may need to adjust any graphs that used + metrics with these suffixes. +* [CHANGE] Reduce log levels [#92](https://github.com/prometheus/statsd_exporter/pulls/92). Many log events have been changed from error + to debug log level. +* [CHANGE] Use YAML for configuration file [#66](https://github.com/prometheus/statsd_exporter/pulls/66). See note above about file format + conversion. +* [ENHANCEMENT] Allow help text to be customized [#87](https://github.com/prometheus/statsd_exporter/pulls/87) +* [ENHANCEMENT] Add support for regex mappers [#85](https://github.com/prometheus/statsd_exporter/pulls/85) +* [ENHANCEMENT] Add TCP listener support [#71](https://github.com/prometheus/statsd_exporter/pulls/71) +* [ENHANCEMENT] Allow histograms for timer metrics [#66](https://github.com/prometheus/statsd_exporter/pulls/66) +* [ENHANCEMENT] Added support for sampling factor on timing events [#28](https://github.com/prometheus/statsd_exporter/pulls/28) +* [BUGFIX] Conflicting label sets no longer crash the exporter and will be + ignored. Restart to clear the remembered label set. [#72](https://github.com/prometheus/statsd_exporter/pulls/72) + +## 0.4.0 / 2017-05-12 + +* [ENHANCEMENT] Improve mapping configuration parser [#61](https://github.com/prometheus/statsd_exporter/pulls/61) +* [ENHANCEMENT] Add increment/decrement support to Gauges [#65](https://github.com/prometheus/statsd_exporter/pulls/65) +* [BUGFIX] Tolerate more forms of broken lines from StatsD [#48](https://github.com/prometheus/statsd_exporter/pulls/48) +* [BUGFIX] Skip metrics with invalid utf8 [#50](https://github.com/prometheus/statsd_exporter/pulls/50) +* [BUGFIX] ListenAndServe now fails on exit [#58](https://github.com/prometheus/statsd_exporter/pulls/58) + +## 0.3.0 / 2016-05-05 + +* [CHANGE] Drop `_count` suffix for `loaded_mappings` metric ([#41](https://github.com/prometheus/statsd_exporter/pulls/41)) +* [ENHANCEMENT] Use common's log and version packages, and add -version flag ([#44](https://github.com/prometheus/statsd_exporter/pulls/44)) +* [ENHANCEMENT] Add flag to disable metric type suffixes ([#37](https://github.com/prometheus/statsd_exporter/pulls/37)) +* [BUGFIX] Increase receivable UDP datagram size to 65535 bytes ([#36](https://github.com/prometheus/statsd_exporter/pulls/36)) +* [BUGFIX] Warn, not panic when negative number counter is submitted ([#33](https://github.com/prometheus/statsd_exporter/pulls/33)) + +## 0.2.0 / 2016-03-19 + +NOTE: This release renames `statsd_bridge` to `statsd_exporter` + +* [CHANGE] New Dockerfile using alpine-golang-make-onbuild base image ([#17](https://github.com/prometheus/statsd_exporter/pulls/17)) +* [ENHANCEMENT] Allow configuration of UDP read buffer ([#22](https://github.com/prometheus/statsd_exporter/pulls/22)) +* [BUGFIX] allow metrics with dashes when mapping ([#24](https://github.com/prometheus/statsd_exporter/pulls/24)) +* [ENHANCEMENT] add root endpoint with redirect ([#25](https://github.com/prometheus/statsd_exporter/pulls/25)) +* [CHANGE] rename bridge to exporter ([#26](https://github.com/prometheus/statsd_exporter/pulls/26)) + + +## 0.1.0 / 2015-04-17 + +* Initial release diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 40503ed..b9aa654 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,18 +1,18 @@ -# Contributing - -Prometheus uses GitHub to manage reviews of pull requests. - -* If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see - [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. - -* If you plan to do something more involved, first discuss your ideas - on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). - This will avoid unnecessary work and surely give you and us a good deal - of inspiration. - -* Relevant coding style guidelines are the [Go Code Review - Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) - and the _Formatting and style_ section of Peter Bourgon's [Go: Best - Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/Dockerfile b/Dockerfile index f4a1910..9a7c52c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,13 @@ -ARG ARCH="amd64" -ARG OS="linux" -FROM quay.io/prometheus/busybox-${OS}-${ARCH}:latest -LABEL maintainer="The Prometheus Authors " - -ARG ARCH="amd64" -ARG OS="linux" -COPY .build/${OS}-${ARCH}/statsd_exporter /bin/statsd_exporter - -USER nobody -EXPOSE 9102 9125 9125/udp -HEALTHCHECK CMD wget --spider -S "http://localhost:9102/metrics" -T 60 2>&1 || exit 1 -ENTRYPOINT [ "/bin/statsd_exporter" ] +ARG ARCH="amd64" +ARG OS="linux" +FROM quay.io/prometheus/busybox-${OS}-${ARCH}:latest +LABEL maintainer="The Prometheus Authors " + +ARG ARCH="amd64" +ARG OS="linux" +COPY .build/${OS}-${ARCH}/statsd_exporter /bin/statsd_exporter + +USER nobody +EXPOSE 9102 9125 9125/udp +HEALTHCHECK CMD wget --spider -S "http://localhost:9102/metrics" -T 60 2>&1 || exit 1 +ENTRYPOINT [ "/bin/statsd_exporter" ] diff --git a/LICENSE b/LICENSE index 261eeb9..29f81d8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,201 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 51ab4d8..4d2dc99 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1 +1 @@ -* Matthias Rampke +* Matthias Rampke diff --git a/Makefile b/Makefile index 62f00e2..4d3552f 100644 --- a/Makefile +++ b/Makefile @@ -1,28 +1,28 @@ -# Copyright 2013 The Prometheus Authors -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Needs to be defined before including Makefile.common to auto-generate targets -DOCKER_ARCHS ?= amd64 armv7 arm64 - -include Makefile.common - -STATICCHECK_IGNORE = - -DOCKER_IMAGE_NAME ?= statsd-exporter - -.PHONY: bench -bench: - @echo ">> running all benchmarks" - $(GO) test -bench . -race $(pkgs) - -all: bench +# Copyright 2013 The Prometheus Authors +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Needs to be defined before including Makefile.common to auto-generate targets +DOCKER_ARCHS ?= amd64 armv7 arm64 + +include Makefile.common + +STATICCHECK_IGNORE = + +DOCKER_IMAGE_NAME ?= statsd-exporter + +.PHONY: bench +bench: + @echo ">> running all benchmarks" + $(GO) test -bench . -race $(pkgs) + +all: bench diff --git a/Makefile.common b/Makefile.common index b978dfc..ad022a6 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1,289 +1,289 @@ -# Copyright 2018 The Prometheus Authors -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# A common Makefile that includes rules to be reused in different prometheus projects. -# !!! Open PRs only against the prometheus/prometheus/Makefile.common repository! - -# Example usage : -# Create the main Makefile in the root project directory. -# include Makefile.common -# customTarget: -# @echo ">> Running customTarget" -# - -# Ensure GOBIN is not set during build so that promu is installed to the correct path -unexport GOBIN - -GO ?= go -GOFMT ?= $(GO)fmt -FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) -GOOPTS ?= -GOHOSTOS ?= $(shell $(GO) env GOHOSTOS) -GOHOSTARCH ?= $(shell $(GO) env GOHOSTARCH) - -GO_VERSION ?= $(shell $(GO) version) -GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) -PRE_GO_111 ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.') - -GOVENDOR := -GO111MODULE := -ifeq (, $(PRE_GO_111)) - ifneq (,$(wildcard go.mod)) - # Enforce Go modules support just in case the directory is inside GOPATH (and for Travis CI). - GO111MODULE := on - - ifneq (,$(wildcard vendor)) - # Always use the local vendor/ directory to satisfy the dependencies. - GOOPTS := $(GOOPTS) -mod=vendor - endif - endif -else - ifneq (,$(wildcard go.mod)) - ifneq (,$(wildcard vendor)) -$(warning This repository requires Go >= 1.11 because of Go modules) -$(warning Some recipes may not work as expected as the current Go runtime is '$(GO_VERSION_NUMBER)') - endif - else - # This repository isn't using Go modules (yet). - GOVENDOR := $(FIRST_GOPATH)/bin/govendor - endif -endif -PROMU := $(FIRST_GOPATH)/bin/promu -pkgs = ./... - -ifeq (arm, $(GOHOSTARCH)) - GOHOSTARM ?= $(shell GOARM= $(GO) env GOARM) - GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)v$(GOHOSTARM) -else - GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH) -endif - -GOTEST := $(GO) test -GOTEST_DIR := -ifneq ($(CIRCLE_JOB),) -ifneq ($(shell which gotestsum),) - GOTEST_DIR := test-results - GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml -- -endif -endif - -PROMU_VERSION ?= 0.5.0 -PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz - -GOLANGCI_LINT := -GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.18.0 -# golangci-lint only supports linux, darwin and windows platforms on i386/amd64. -# windows isn't included here because of the path separator being different. -ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) - ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386)) - GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint - endif -endif - -PREFIX ?= $(shell pwd) -BIN_DIR ?= $(shell pwd) -DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD)) -DOCKERFILE_PATH ?= ./Dockerfile -DOCKERBUILD_CONTEXT ?= ./ -DOCKER_REPO ?= prom - -DOCKER_ARCHS ?= amd64 - -BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS)) -PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS)) -TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS)) - -ifeq ($(GOHOSTARCH),amd64) - ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows)) - # Only supported on amd64 - test-flags := -race - endif -endif - -# This rule is used to forward a target like "build" to "common-build". This -# allows a new "build" target to be defined in a Makefile which includes this -# one and override "common-build" without override warnings. -%: common-% ; - -.PHONY: common-all -common-all: precheck style check_license lint unused build test - -.PHONY: common-style -common-style: - @echo ">> checking code style" - @fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \ - if [ -n "$${fmtRes}" ]; then \ - echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \ - echo "Please ensure you are using $$($(GO) version) for formatting code."; \ - exit 1; \ - fi - -.PHONY: common-check_license -common-check_license: - @echo ">> checking license header" - @licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \ - awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \ - done); \ - if [ -n "$${licRes}" ]; then \ - echo "license header checking failed:"; echo "$${licRes}"; \ - exit 1; \ - fi - -.PHONY: common-deps -common-deps: - @echo ">> getting dependencies" -ifdef GO111MODULE - GO111MODULE=$(GO111MODULE) $(GO) mod download -else - $(GO) get $(GOOPTS) -t ./... -endif - -.PHONY: common-test-short -common-test-short: $(GOTEST_DIR) - @echo ">> running short tests" - GO111MODULE=$(GO111MODULE) $(GOTEST) -short $(GOOPTS) $(pkgs) - -.PHONY: common-test -common-test: $(GOTEST_DIR) - @echo ">> running all tests" - GO111MODULE=$(GO111MODULE) $(GOTEST) $(test-flags) $(GOOPTS) $(pkgs) - -$(GOTEST_DIR): - @mkdir -p $@ - -.PHONY: common-format -common-format: - @echo ">> formatting code" - GO111MODULE=$(GO111MODULE) $(GO) fmt $(pkgs) - -.PHONY: common-vet -common-vet: - @echo ">> vetting code" - GO111MODULE=$(GO111MODULE) $(GO) vet $(GOOPTS) $(pkgs) - -.PHONY: common-lint -common-lint: $(GOLANGCI_LINT) -ifdef GOLANGCI_LINT - @echo ">> running golangci-lint" -ifdef GO111MODULE -# 'go list' needs to be executed before staticcheck to prepopulate the modules cache. -# Otherwise staticcheck might fail randomly for some reason not yet explained. - GO111MODULE=$(GO111MODULE) $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null - GO111MODULE=$(GO111MODULE) $(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs) -else - $(GOLANGCI_LINT) run $(pkgs) -endif -endif - -# For backward-compatibility. -.PHONY: common-staticcheck -common-staticcheck: lint - -.PHONY: common-unused -common-unused: $(GOVENDOR) -ifdef GOVENDOR - @echo ">> running check for unused packages" - @$(GOVENDOR) list +unused | grep . && exit 1 || echo 'No unused packages' -else -ifdef GO111MODULE - @echo ">> running check for unused/missing packages in go.mod" - GO111MODULE=$(GO111MODULE) $(GO) mod tidy -ifeq (,$(wildcard vendor)) - @git diff --exit-code -- go.sum go.mod -else - @echo ">> running check for unused packages in vendor/" - GO111MODULE=$(GO111MODULE) $(GO) mod vendor - @git diff --exit-code -- go.sum go.mod vendor/ -endif -endif -endif - -.PHONY: common-build -common-build: promu - @echo ">> building binaries" - GO111MODULE=$(GO111MODULE) $(PROMU) build --prefix $(PREFIX) $(PROMU_BINARIES) - -.PHONY: common-tarball -common-tarball: promu - @echo ">> building release tarball" - $(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR) - -.PHONY: common-docker $(BUILD_DOCKER_ARCHS) -common-docker: $(BUILD_DOCKER_ARCHS) -$(BUILD_DOCKER_ARCHS): common-docker-%: - docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \ - -f $(DOCKERFILE_PATH) \ - --build-arg ARCH="$*" \ - --build-arg OS="linux" \ - $(DOCKERBUILD_CONTEXT) - -.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS) -common-docker-publish: $(PUBLISH_DOCKER_ARCHS) -$(PUBLISH_DOCKER_ARCHS): common-docker-publish-%: - docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" - -.PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS) -common-docker-tag-latest: $(TAG_DOCKER_ARCHS) -$(TAG_DOCKER_ARCHS): common-docker-tag-latest-%: - docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" - -.PHONY: common-docker-manifest -common-docker-manifest: - DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(DOCKER_IMAGE_TAG)) - DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" - -.PHONY: promu -promu: $(PROMU) - -$(PROMU): - $(eval PROMU_TMP := $(shell mktemp -d)) - curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP) - mkdir -p $(FIRST_GOPATH)/bin - cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu - rm -r $(PROMU_TMP) - -.PHONY: proto -proto: - @echo ">> generating code from proto files" - @./scripts/genproto.sh - -ifdef GOLANGCI_LINT -$(GOLANGCI_LINT): - mkdir -p $(FIRST_GOPATH)/bin - curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_LINT_VERSION)/install.sh \ - | sed -e '/install -d/d' \ - | sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION) -endif - -ifdef GOVENDOR -.PHONY: $(GOVENDOR) -$(GOVENDOR): - GOOS= GOARCH= $(GO) get -u github.com/kardianos/govendor -endif - -.PHONY: precheck -precheck:: - -define PRECHECK_COMMAND_template = -precheck:: $(1)_precheck - -PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1))) -.PHONY: $(1)_precheck -$(1)_precheck: - @if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \ - echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \ - exit 1; \ - fi -endef +# Copyright 2018 The Prometheus Authors +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# A common Makefile that includes rules to be reused in different prometheus projects. +# !!! Open PRs only against the prometheus/prometheus/Makefile.common repository! + +# Example usage : +# Create the main Makefile in the root project directory. +# include Makefile.common +# customTarget: +# @echo ">> Running customTarget" +# + +# Ensure GOBIN is not set during build so that promu is installed to the correct path +unexport GOBIN + +GO ?= go +GOFMT ?= $(GO)fmt +FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) +GOOPTS ?= +GOHOSTOS ?= $(shell $(GO) env GOHOSTOS) +GOHOSTARCH ?= $(shell $(GO) env GOHOSTARCH) + +GO_VERSION ?= $(shell $(GO) version) +GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) +PRE_GO_111 ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.') + +GOVENDOR := +GO111MODULE := +ifeq (, $(PRE_GO_111)) + ifneq (,$(wildcard go.mod)) + # Enforce Go modules support just in case the directory is inside GOPATH (and for Travis CI). + GO111MODULE := on + + ifneq (,$(wildcard vendor)) + # Always use the local vendor/ directory to satisfy the dependencies. + GOOPTS := $(GOOPTS) -mod=vendor + endif + endif +else + ifneq (,$(wildcard go.mod)) + ifneq (,$(wildcard vendor)) +$(warning This repository requires Go >= 1.11 because of Go modules) +$(warning Some recipes may not work as expected as the current Go runtime is '$(GO_VERSION_NUMBER)') + endif + else + # This repository isn't using Go modules (yet). + GOVENDOR := $(FIRST_GOPATH)/bin/govendor + endif +endif +PROMU := $(FIRST_GOPATH)/bin/promu +pkgs = ./... + +ifeq (arm, $(GOHOSTARCH)) + GOHOSTARM ?= $(shell GOARM= $(GO) env GOARM) + GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)v$(GOHOSTARM) +else + GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH) +endif + +GOTEST := $(GO) test +GOTEST_DIR := +ifneq ($(CIRCLE_JOB),) +ifneq ($(shell which gotestsum),) + GOTEST_DIR := test-results + GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml -- +endif +endif + +PROMU_VERSION ?= 0.5.0 +PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz + +GOLANGCI_LINT := +GOLANGCI_LINT_OPTS ?= +GOLANGCI_LINT_VERSION ?= v1.18.0 +# golangci-lint only supports linux, darwin and windows platforms on i386/amd64. +# windows isn't included here because of the path separator being different. +ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) + ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386)) + GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint + endif +endif + +PREFIX ?= $(shell pwd) +BIN_DIR ?= $(shell pwd) +DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD)) +DOCKERFILE_PATH ?= ./Dockerfile +DOCKERBUILD_CONTEXT ?= ./ +DOCKER_REPO ?= prom + +DOCKER_ARCHS ?= amd64 + +BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS)) +PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS)) +TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS)) + +ifeq ($(GOHOSTARCH),amd64) + ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows)) + # Only supported on amd64 + test-flags := -race + endif +endif + +# This rule is used to forward a target like "build" to "common-build". This +# allows a new "build" target to be defined in a Makefile which includes this +# one and override "common-build" without override warnings. +%: common-% ; + +.PHONY: common-all +common-all: precheck style check_license lint unused build test + +.PHONY: common-style +common-style: + @echo ">> checking code style" + @fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \ + if [ -n "$${fmtRes}" ]; then \ + echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \ + echo "Please ensure you are using $$($(GO) version) for formatting code."; \ + exit 1; \ + fi + +.PHONY: common-check_license +common-check_license: + @echo ">> checking license header" + @licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \ + awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \ + done); \ + if [ -n "$${licRes}" ]; then \ + echo "license header checking failed:"; echo "$${licRes}"; \ + exit 1; \ + fi + +.PHONY: common-deps +common-deps: + @echo ">> getting dependencies" +ifdef GO111MODULE + GO111MODULE=$(GO111MODULE) $(GO) mod download +else + $(GO) get $(GOOPTS) -t ./... +endif + +.PHONY: common-test-short +common-test-short: $(GOTEST_DIR) + @echo ">> running short tests" + GO111MODULE=$(GO111MODULE) $(GOTEST) -short $(GOOPTS) $(pkgs) + +.PHONY: common-test +common-test: $(GOTEST_DIR) + @echo ">> running all tests" + GO111MODULE=$(GO111MODULE) $(GOTEST) $(test-flags) $(GOOPTS) $(pkgs) + +$(GOTEST_DIR): + @mkdir -p $@ + +.PHONY: common-format +common-format: + @echo ">> formatting code" + GO111MODULE=$(GO111MODULE) $(GO) fmt $(pkgs) + +.PHONY: common-vet +common-vet: + @echo ">> vetting code" + GO111MODULE=$(GO111MODULE) $(GO) vet $(GOOPTS) $(pkgs) + +.PHONY: common-lint +common-lint: $(GOLANGCI_LINT) +ifdef GOLANGCI_LINT + @echo ">> running golangci-lint" +ifdef GO111MODULE +# 'go list' needs to be executed before staticcheck to prepopulate the modules cache. +# Otherwise staticcheck might fail randomly for some reason not yet explained. + GO111MODULE=$(GO111MODULE) $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null + GO111MODULE=$(GO111MODULE) $(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs) +else + $(GOLANGCI_LINT) run $(pkgs) +endif +endif + +# For backward-compatibility. +.PHONY: common-staticcheck +common-staticcheck: lint + +.PHONY: common-unused +common-unused: $(GOVENDOR) +ifdef GOVENDOR + @echo ">> running check for unused packages" + @$(GOVENDOR) list +unused | grep . && exit 1 || echo 'No unused packages' +else +ifdef GO111MODULE + @echo ">> running check for unused/missing packages in go.mod" + GO111MODULE=$(GO111MODULE) $(GO) mod tidy +ifeq (,$(wildcard vendor)) + @git diff --exit-code -- go.sum go.mod +else + @echo ">> running check for unused packages in vendor/" + GO111MODULE=$(GO111MODULE) $(GO) mod vendor + @git diff --exit-code -- go.sum go.mod vendor/ +endif +endif +endif + +.PHONY: common-build +common-build: promu + @echo ">> building binaries" + GO111MODULE=$(GO111MODULE) $(PROMU) build --prefix $(PREFIX) $(PROMU_BINARIES) + +.PHONY: common-tarball +common-tarball: promu + @echo ">> building release tarball" + $(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR) + +.PHONY: common-docker $(BUILD_DOCKER_ARCHS) +common-docker: $(BUILD_DOCKER_ARCHS) +$(BUILD_DOCKER_ARCHS): common-docker-%: + docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \ + -f $(DOCKERFILE_PATH) \ + --build-arg ARCH="$*" \ + --build-arg OS="linux" \ + $(DOCKERBUILD_CONTEXT) + +.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS) +common-docker-publish: $(PUBLISH_DOCKER_ARCHS) +$(PUBLISH_DOCKER_ARCHS): common-docker-publish-%: + docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" + +.PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS) +common-docker-tag-latest: $(TAG_DOCKER_ARCHS) +$(TAG_DOCKER_ARCHS): common-docker-tag-latest-%: + docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" + +.PHONY: common-docker-manifest +common-docker-manifest: + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(DOCKER_IMAGE_TAG)) + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" + +.PHONY: promu +promu: $(PROMU) + +$(PROMU): + $(eval PROMU_TMP := $(shell mktemp -d)) + curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP) + mkdir -p $(FIRST_GOPATH)/bin + cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu + rm -r $(PROMU_TMP) + +.PHONY: proto +proto: + @echo ">> generating code from proto files" + @./scripts/genproto.sh + +ifdef GOLANGCI_LINT +$(GOLANGCI_LINT): + mkdir -p $(FIRST_GOPATH)/bin + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_LINT_VERSION)/install.sh \ + | sed -e '/install -d/d' \ + | sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION) +endif + +ifdef GOVENDOR +.PHONY: $(GOVENDOR) +$(GOVENDOR): + GOOS= GOARCH= $(GO) get -u github.com/kardianos/govendor +endif + +.PHONY: precheck +precheck:: + +define PRECHECK_COMMAND_template = +precheck:: $(1)_precheck + +PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1))) +.PHONY: $(1)_precheck +$(1)_precheck: + @if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \ + echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \ + exit 1; \ + fi +endef diff --git a/NOTICE b/NOTICE index 33179a9..092b9ab 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ -StatsD-to-Prometheus exporter -Copyright 2013-2015 The Prometheus Authors - -This product includes software developed at -SoundCloud Ltd. (http://soundcloud.com/). +StatsD-to-Prometheus exporter +Copyright 2013-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/README.md b/README.md index bdadbcd..ffca02c 100644 --- a/README.md +++ b/README.md @@ -1,474 +1,474 @@ -# statsd exporter [![Build Status](https://travis-ci.org/prometheus/statsd_exporter.svg)][travis] - -[![CircleCI](https://circleci.com/gh/prometheus/statsd_exporter/tree/master.svg?style=shield)][circleci] -[![Docker Repository on Quay](https://quay.io/repository/prometheus/statsd-exporter/status)][quay] -[![Docker Pulls](https://img.shields.io/docker/pulls/prom/statsd-exporter.svg)][hub] - -`statsd_exporter` receives StatsD-style metrics and exports them as Prometheus metrics. - -## Overview - -### With StatsD - -To pipe metrics from an existing StatsD environment into Prometheus, configure -StatsD's repeater backend to repeat all received metrics to a `statsd_exporter` -process. This exporter translates StatsD metrics to Prometheus metrics via -configured mapping rules. - - +----------+ +-------------------+ +--------------+ - | StatsD |---(UDP/TCP repeater)--->| statsd_exporter |<---(scrape /metrics)---| Prometheus | - +----------+ +-------------------+ +--------------+ - -### Without StatsD - -Since the StatsD exporter uses the same line protocol as StatsD itself, you can -also configure your applications to send StatsD metrics directly to the exporter. -In that case, you don't need to run a StatsD server anymore. - -We recommend this only as an intermediate solution and recommend switching to -[native Prometheus instrumentation](http://prometheus.io/docs/instrumenting/clientlibs/) -in the long term. - -### Tagging Extensions - -The exporter supports Librato, InfluxDB, and DogStatsD-style tags, -which will be converted into Prometheus labels. - -For Librato-style tags, they must be appended to the metric name with a -delimiting `#`, as so: - -``` -metric.name#tagName=val,tag2Name=val2:0|c -``` - -See the [statsd-librato-backend README](https://github.com/librato/statsd-librato-backend#tags) -for a more complete description. - -For InfluxDB-style tags, they must be appended to the metric name with a -delimiting comma, as so: - -``` -metric.name,tagName=val,tag2Name=val2:0|c -``` - -See [this InfluxDB blog post](https://www.influxdata.com/blog/getting-started-with-sending-statsd-metrics-to-telegraf-influxdb/#introducing-influx-statsd) -for a larger overview. - - -For DogStatsD-style tags, they're appended as a `|#` delimited section at the -end of the metric, as so: - -``` -metric.name:0|c|#tagName:val,tag2Name:val2 -``` - -See [Tags](https://docs.datadoghq.com/developers/dogstatsd/data_types/#tagging) -in the DogStatsD documentation for the concept description and -[Datagram Format](https://docs.datadoghq.com/developers/dogstatsd/datagram_shell/). -If you encounter problems, note that this tagging style is incompatible with -the original `statsd` implementation. - -Be aware: If you mix tag styles (e.g., Librato/InfluxDB with DogStatsD), the -exporter will consider this an error and the sample will be discarded. Also, -tags without values (`#some_tag`) are not supported and will be ignored. - -## Building and Running - -NOTE: Version 0.7.0 switched to the [kingpin](https://github.com/alecthomas/kingpin) flags library. With this change, flag behaviour is POSIX-ish: - -* long flags start with two dashes (`--version`) -* multiple short flags can be combined (but there currently is only one) -* flag processing stops at the first `--` - - ``` - $ go build - $ ./statsd_exporter --help - usage: statsd_exporter [] - - Flags: - -h, --help Show context-sensitive help (also try --help-long and --help-man). - --web.listen-address=":9102" - The address on which to expose the web interface and generated Prometheus metrics. - --web.telemetry-path="/metrics" - Path under which to expose metrics. - --statsd.listen-udp=":9125" - The UDP address on which to receive statsd metric lines. "" disables it. - --statsd.listen-tcp=":9125" - The TCP address on which to receive statsd metric lines. "" disables it. - --statsd.listen-unixgram="" - The Unixgram socket path to receive statsd metric lines in datagram. "" disables it. - --statsd.unixsocket-mode="755" - The permission mode of the unix socket. - --statsd.mapping-config=STATSD.MAPPING-CONFIG - Metric mapping configuration file name. - --statsd.read-buffer=STATSD.READ-BUFFER - Size (in bytes) of the operating system's transmit read buffer associated with the UDP or Unixgram connection. Please make sure the kernel parameters net.core.rmem_max is set to - a value greater than the value specified. - --statsd.cache-size=1000 Maximum size of your metric mapping cache. Relies on least recently used replacement policy if max size is reached. - --statsd.event-queue-size=10000 - Size of internal queue for processing events - --statsd.event-flush-threshold=1000 - Number of events to hold in queue before flushing - --statsd.event-flush-interval=200ms - Number of events to hold in queue before flushing - --debug.dump-fsm="" The path to dump internal FSM generated for glob matching as Dot file. - --log.level="info" Only log messages with the given severity or above. Valid levels: [debug, info, warn, error, fatal] - --log.format="logger:stderr" - Set the log target and format. Example: "logger:syslog?appname=bob& local=7" or "logger:stdout?json=true" - --version Show application version. - - ``` - -## Tests - - $ go test - -## Metric Mapping and Configuration - -The `statsd_exporter` can be configured to translate specific dot-separated StatsD -metrics into labeled Prometheus metrics via a simple mapping language. The config -file is reloaded on SIGHUP. - -A mapping definition starts with a line matching the StatsD metric in question, -with `*`s acting as wildcards for each dot-separated metric component. The -lines following the matching expression must contain one `label="value"` pair -each, and at least define the metric name (label name `name`). The Prometheus -metric is then constructed from these labels. `$n`-style references in the -label value are replaced by the n-th wildcard match in the matching line, -starting at 1. Multiple matching definitions are separated by one or more empty -lines. The first mapping rule that matches a StatsD metric wins. - -Metrics that don't match any mapping in the configuration file are translated -into Prometheus metrics without any labels and with any non-alphanumeric -characters, including periods, translated into underscores. - -In general, the different metric types are translated as follows: - - StatsD gauge -> Prometheus gauge - - StatsD counter -> Prometheus counter - - StatsD timer -> Prometheus summary <-- indicates timer quantiles - -> Prometheus counter (suffix `_total`) <-- indicates total time spent - -> Prometheus counter (suffix `_count`) <-- indicates total number of timer events - -An example mapping configuration: - -```yaml -mappings: -- match: "test.dispatcher.*.*.*" - name: "dispatcher_events_total" - labels: - processor: "$1" - action: "$2" - outcome: "$3" - job: "test_dispatcher" -- match: "*.signup.*.*" - name: "signup_events_total" - labels: - provider: "$2" - outcome: "$3" - job: "${1}_server" -``` - -This would transform these example StatsD metrics into Prometheus metrics as -follows: - - test.dispatcher.FooProcessor.send.success - => dispatcher_events_total{processor="FooProcessor", action="send", outcome="success", job="test_dispatcher"} - - foo_product.signup.facebook.failure - => signup_events_total{provider="facebook", outcome="failure", job="foo_product_server"} - - test.web-server.foo.bar - => test_web_server_foo_bar{} - -Each mapping in the configuration file must define a `name` for the metric. The -metric's name can contain `$n`-style references to be replaced by the n-th -wildcard match in the matching line. That allows for dynamic rewrites, such as: - -```yaml -mappings: -- match: "test.*.*.counter" - name: "${2}_total" - labels: - provider: "$1" -``` - -The metric name can also contain references to regex matches. The mapping above -could be written as: - -```yaml -mappings: -- match: "test\\.(\\w+)\\.(\\w+)\\.counter" - match_type: regex - name: "${2}_total" - labels: - provider: "$1" -``` - -Be aware about yaml escape rules as a mapping like the following one will not work. -```yaml -mappings: -- match: "test\.(\w+)\.(\w+)\.counter" - match_type: regex - name: "${2}_total" - labels: - provider: "$1" -``` - -Please note that metrics with the same name must also have the same set of -label names. - -If the default metric help text is insufficient for your needs you may use the YAML -configuration to specify a custom help text for each mapping: - -```yaml -mappings: -- match: "http.request.*" - help: "Total number of http requests" - name: "http_requests_total" - labels: - code: "$1" -``` - -### StatsD timers - -By default, statsd timers are represented as a Prometheus summary with -quantiles. You may optionally configure the [quantiles and acceptable -error](https://prometheus.io/docs/practices/histograms/#quantiles), as -well as adjusting how the summary metric is aggregated: - -```yaml -mappings: -- match: "test.timing.*.*.*" - timer_type: summary - name: "my_timer" - labels: - provider: "$2" - outcome: "$3" - job: "${1}_server" - summary_options: - quantiles: - - quantile: 0.99 - error: 0.001 - - quantile: 0.95 - error: 0.01 - - quantile: 0.9 - error: 0.05 - - quantile: 0.5 - error: 0.005 - max_summary_age: 30s - summary_age_buckets: 3 - stream_buffer_size: 1000 -``` - -The default quantiles are 0.99, 0.9, and 0.5. - -The default summary age is 10 minutes, the default number of buckets -is 5 and the default buffer size is 500. See also the -[`golang_client` docs](https://godoc.org/github.com/prometheus/client_golang/prometheus#SummaryOpts). -The `max_summary_age` corresponds to `SummaryOptions.MaxAge`, `summary_age_buckets` -to `SummaryOptions.AgeBuckets` and `stream_buffer_size` to `SummaryOptions.BufCap`. - -In the configuration, one may also set the timer type to "histogram". The -default is "summary" as in the plain text configuration format. For example, -to set the timer type for a single metric: - -```yaml -mappings: -- match: "test.timing.*.*.*" - timer_type: histogram - histogram_options: - buckets: [ 0.01, 0.025, 0.05, 0.1 ] - name: "my_timer" - labels: - provider: "$2" - outcome: "$3" - job: "${1}_server" -``` - -Note that timers will be accepted with the `ms`, `h`, and `d` statsd types. The first two are timers and histograms and the `d` type is for DataDog's "distribution" type. The distribution type is treated identically to timers and histograms. - -It should be noted that whereas timers in statsd expects the unit of timing data to be in milliseconds, -prometheus expects the unit to be seconds. Hence, the exporter converts all timers to seconds -before exporting them. - -### DogStatsD Client Behavior - -#### `timed()` decorator - -If you are using the DogStatsD client's [timed](https://datadogpy.readthedocs.io/en/latest/#datadog.threadstats.base.ThreadStats.timed) decorator, -it emits the metric in seconds, set [use_ms](https://datadogpy.readthedocs.io/en/latest/index.html?highlight=use_ms) to `True` to fix this. - -### Regular expression matching - -Another capability when using YAML configuration is the ability to define matches -using raw regular expressions as opposed to the default globbing style of match. -This may allow for pulling structured data from otherwise poorly named statsd -metrics AND allow for more precise targetting of match rules. When no `match_type` -paramter is specified the default value of `glob` will be assumed: - -```yaml -mappings: -- match: "(.*)\.(.*)--(.*)\.status\.(.*)\.count" - match_type: regex - name: "request_total" - labels: - hostname: "$1" - exec: "$2" - protocol: "$3" - code: "$4" -``` - -Note, that one may also set the histogram buckets. If not set, then the default -[Prometheus client values](https://godoc.org/github.com/prometheus/client_golang/prometheus#pkg-variables) are used: `[.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10]`. `+Inf` is added -automatically. - -`timer_type` is only used when the statsd metric type is a timer. `buckets` is -only used when the statsd metric type is a timerand the `timer_type` is set to -"histogram." - -### Global defaults - -One may also set defaults for the timer type, buckets or quantiles, and match_type. These will be used -by all mappings that do not define these. - -An option that can only be configured in `defaults` is `glob_disable_ordering`, which is `false` if omitted. By setting this to `true`, `glob` match type will not honor the occurance of rules in the mapping rules file and always treat `*` as lower priority than a general string. - -```yaml -defaults: - timer_type: histogram - buckets: [.005, .01, .025, .05, .1, .25, .5, 1, 2.5 ] - match_type: glob - glob_disable_ordering: false - ttl: 0 # metrics do not expire -mappings: -# This will be a histogram using the buckets set in `defaults`. -- match: "test.timing.*.*.*" - name: "my_timer" - labels: - provider: "$2" - outcome: "$3" - job: "${1}_server" -# This will be a summary timer. -- match: "other.timing.*.*.*" - timer_type: summary - name: "other_timer" - labels: - provider: "$2" - outcome: "$3" - job: "${1}_server_other" -``` - -### Choosing between glob or regex match type - -Despite from the missing flexibility of using regular expression in mapping and -formatting labels, `glob` matching is optimized to have better performance than -`regex` in certain use cases. In short, glob will have best performance if the -rules amount is not so less and captures (using of `*`) is not to much in a -single rule. Whether disabling ordering in glob or not won't have a noticable -effect on performance in general use cases. In edge cases like the below however, -disabling ordering will be beneficial: - - a.*.*.*.* - a.b.*.*.* - a.b.c.*.* - a.b.c.d.* - -The reason is that the list assignment of captures (using of `*`) is the most -expensive operation in glob. Honoring ordering will result in up to 10 list -assignments, while without ordering it will need only 4 at most. - -For details, see [pkg/mapper/fsm/README.md](pkg/mapper/fsm/README.md). -Running `go test -bench .` in **pkg/mapper** directory will produce -a detailed comparison between the two match type. - -### `drop` action - -You may also drop metrics by specifying a "drop" action on a match. For -example: - -```yaml -mappings: -# This metric would match as normal. -- match: "test.timing.*.*.*" - name: "my_timer" - labels: - provider: "$2" - outcome: "$3" - job: "${1}_server" -# Any metric not matched will be dropped because "." matches all metrics. -- match: "." - match_type: regex - action: drop - name: "dropped" -``` - -You can drop any metric using the normal match syntax. -The default action is "map" which does the normal metrics mapping. - -### Explicit metric type mapping - -StatsD allows emitting of different metric types under the same metric name, -but the Prometheus client library can't merge those. For this use-case the -mapping definition allows you to specify which metric type to match: - -``` -mappings: -- match: "test.foo.*" - name: "test_foo" - match_metric_type: counter - labels: - provider: "$1" -``` - -Possible values for `match_metric_type` are `gauge`, `counter` and `timer`. - -### Mapping cache size and cache replacement policy - -There is a cache used to improve the performance of the metric mapping, that can greatly improvement performance. -The cache has a default maximum of 1000 unique statsd metric names -> prometheus metrics mappings that it can store. -This maximum can be adjust using the `statsd.cache-size` flag. - -If the maximum is reached, entries are by default rotated using the [least recently used replacement policy](https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)). This strategy is optimal when memory is constrained as only the most recent entries are retained. - -Alternatively, you can choose a [random-replacement cache strategy](https://en.wikipedia.org/wiki/Cache_replacement_policies#Random_replacement_(RR)). This is less optimal if the cache is smaller than the cacheable set, but requires less locking. Use this for very high throughput, but make sure to allow for a cache that holds all metrics. - -The optimal cache size is determined by the cardinality of the _incoming_ metrics. - -### Time series expiration - -The `ttl` parameter can be used to define the expiration time for stale metrics. -The value is a time duration with valid time units: "ns", "us" (or "µs"), -"ms", "s", "m", "h". For example, `ttl: 1m20s`. `0` value is used to indicate -metrics that do not expire. - - TTL configuration is stored for each mapped metric name/labels combination - whenever new samples are received. This means that you cannot immediately - expire a metric only by changing the mapping configuration. At least one - sample must be received for updated mappings to take effect. - - ### Event flushing configuration - - Internally `statsd_exporter` runs a goroutine for each network listener (UDP, TCP & Unix Socket). These each receive and parse metrics received into an event. For performance purposes, these events are queued internally and flushed to the main exporter goroutine periodically in batches. The size of this queue and the flush criteria can be tuned with the `--statsd.event-queue-size`, `--statsd.event-flush-threshold` and `--statsd.event-flush-interval`. However, the defaults should perform well even for very high traffic environments. - -## Using Docker - -You can deploy this exporter using the [prom/statsd-exporter](https://registry.hub.docker.com/r/prom/statsd-exporter) Docker image. - -For example: - -```bash -docker pull prom/statsd-exporter - -docker run -d -p 9102:9102 -p 9125:9125 -p 9125:9125/udp \ - -v $PWD/statsd_mapping.yml:/tmp/statsd_mapping.yml \ - prom/statsd-exporter --statsd.mapping-config=/tmp/statsd_mapping.yml -``` - - -[travis]: https://travis-ci.org/prometheus/statsd_exporter -[circleci]: https://circleci.com/gh/prometheus/statsd_exporter -[quay]: https://quay.io/repository/prometheus/statsd-exporter -[hub]: https://hub.docker.com/r/prom/statsd-exporter/ +# statsd exporter [![Build Status](https://travis-ci.org/prometheus/statsd_exporter.svg)][travis] + +[![CircleCI](https://circleci.com/gh/prometheus/statsd_exporter/tree/master.svg?style=shield)][circleci] +[![Docker Repository on Quay](https://quay.io/repository/prometheus/statsd-exporter/status)][quay] +[![Docker Pulls](https://img.shields.io/docker/pulls/prom/statsd-exporter.svg)][hub] + +`statsd_exporter` receives StatsD-style metrics and exports them as Prometheus metrics. + +## Overview + +### With StatsD + +To pipe metrics from an existing StatsD environment into Prometheus, configure +StatsD's repeater backend to repeat all received metrics to a `statsd_exporter` +process. This exporter translates StatsD metrics to Prometheus metrics via +configured mapping rules. + + +----------+ +-------------------+ +--------------+ + | StatsD |---(UDP/TCP repeater)--->| statsd_exporter |<---(scrape /metrics)---| Prometheus | + +----------+ +-------------------+ +--------------+ + +### Without StatsD + +Since the StatsD exporter uses the same line protocol as StatsD itself, you can +also configure your applications to send StatsD metrics directly to the exporter. +In that case, you don't need to run a StatsD server anymore. + +We recommend this only as an intermediate solution and recommend switching to +[native Prometheus instrumentation](http://prometheus.io/docs/instrumenting/clientlibs/) +in the long term. + +### Tagging Extensions + +The exporter supports Librato, InfluxDB, and DogStatsD-style tags, +which will be converted into Prometheus labels. + +For Librato-style tags, they must be appended to the metric name with a +delimiting `#`, as so: + +``` +metric.name#tagName=val,tag2Name=val2:0|c +``` + +See the [statsd-librato-backend README](https://github.com/librato/statsd-librato-backend#tags) +for a more complete description. + +For InfluxDB-style tags, they must be appended to the metric name with a +delimiting comma, as so: + +``` +metric.name,tagName=val,tag2Name=val2:0|c +``` + +See [this InfluxDB blog post](https://www.influxdata.com/blog/getting-started-with-sending-statsd-metrics-to-telegraf-influxdb/#introducing-influx-statsd) +for a larger overview. + + +For DogStatsD-style tags, they're appended as a `|#` delimited section at the +end of the metric, as so: + +``` +metric.name:0|c|#tagName:val,tag2Name:val2 +``` + +See [Tags](https://docs.datadoghq.com/developers/dogstatsd/data_types/#tagging) +in the DogStatsD documentation for the concept description and +[Datagram Format](https://docs.datadoghq.com/developers/dogstatsd/datagram_shell/). +If you encounter problems, note that this tagging style is incompatible with +the original `statsd` implementation. + +Be aware: If you mix tag styles (e.g., Librato/InfluxDB with DogStatsD), the +exporter will consider this an error and the sample will be discarded. Also, +tags without values (`#some_tag`) are not supported and will be ignored. + +## Building and Running + +NOTE: Version 0.7.0 switched to the [kingpin](https://github.com/alecthomas/kingpin) flags library. With this change, flag behaviour is POSIX-ish: + +* long flags start with two dashes (`--version`) +* multiple short flags can be combined (but there currently is only one) +* flag processing stops at the first `--` + + ``` + $ go build + $ ./statsd_exporter --help + usage: statsd_exporter [] + + Flags: + -h, --help Show context-sensitive help (also try --help-long and --help-man). + --web.listen-address=":9102" + The address on which to expose the web interface and generated Prometheus metrics. + --web.telemetry-path="/metrics" + Path under which to expose metrics. + --statsd.listen-udp=":9125" + The UDP address on which to receive statsd metric lines. "" disables it. + --statsd.listen-tcp=":9125" + The TCP address on which to receive statsd metric lines. "" disables it. + --statsd.listen-unixgram="" + The Unixgram socket path to receive statsd metric lines in datagram. "" disables it. + --statsd.unixsocket-mode="755" + The permission mode of the unix socket. + --statsd.mapping-config=STATSD.MAPPING-CONFIG + Metric mapping configuration file name. + --statsd.read-buffer=STATSD.READ-BUFFER + Size (in bytes) of the operating system's transmit read buffer associated with the UDP or Unixgram connection. Please make sure the kernel parameters net.core.rmem_max is set to + a value greater than the value specified. + --statsd.cache-size=1000 Maximum size of your metric mapping cache. Relies on least recently used replacement policy if max size is reached. + --statsd.event-queue-size=10000 + Size of internal queue for processing events + --statsd.event-flush-threshold=1000 + Number of events to hold in queue before flushing + --statsd.event-flush-interval=200ms + Number of events to hold in queue before flushing + --debug.dump-fsm="" The path to dump internal FSM generated for glob matching as Dot file. + --log.level="info" Only log messages with the given severity or above. Valid levels: [debug, info, warn, error, fatal] + --log.format="logger:stderr" + Set the log target and format. Example: "logger:syslog?appname=bob& local=7" or "logger:stdout?json=true" + --version Show application version. + + ``` + +## Tests + + $ go test + +## Metric Mapping and Configuration + +The `statsd_exporter` can be configured to translate specific dot-separated StatsD +metrics into labeled Prometheus metrics via a simple mapping language. The config +file is reloaded on SIGHUP. + +A mapping definition starts with a line matching the StatsD metric in question, +with `*`s acting as wildcards for each dot-separated metric component. The +lines following the matching expression must contain one `label="value"` pair +each, and at least define the metric name (label name `name`). The Prometheus +metric is then constructed from these labels. `$n`-style references in the +label value are replaced by the n-th wildcard match in the matching line, +starting at 1. Multiple matching definitions are separated by one or more empty +lines. The first mapping rule that matches a StatsD metric wins. + +Metrics that don't match any mapping in the configuration file are translated +into Prometheus metrics without any labels and with any non-alphanumeric +characters, including periods, translated into underscores. + +In general, the different metric types are translated as follows: + + StatsD gauge -> Prometheus gauge + + StatsD counter -> Prometheus counter + + StatsD timer -> Prometheus summary <-- indicates timer quantiles + -> Prometheus counter (suffix `_total`) <-- indicates total time spent + -> Prometheus counter (suffix `_count`) <-- indicates total number of timer events + +An example mapping configuration: + +```yaml +mappings: +- match: "test.dispatcher.*.*.*" + name: "dispatcher_events_total" + labels: + processor: "$1" + action: "$2" + outcome: "$3" + job: "test_dispatcher" +- match: "*.signup.*.*" + name: "signup_events_total" + labels: + provider: "$2" + outcome: "$3" + job: "${1}_server" +``` + +This would transform these example StatsD metrics into Prometheus metrics as +follows: + + test.dispatcher.FooProcessor.send.success + => dispatcher_events_total{processor="FooProcessor", action="send", outcome="success", job="test_dispatcher"} + + foo_product.signup.facebook.failure + => signup_events_total{provider="facebook", outcome="failure", job="foo_product_server"} + + test.web-server.foo.bar + => test_web_server_foo_bar{} + +Each mapping in the configuration file must define a `name` for the metric. The +metric's name can contain `$n`-style references to be replaced by the n-th +wildcard match in the matching line. That allows for dynamic rewrites, such as: + +```yaml +mappings: +- match: "test.*.*.counter" + name: "${2}_total" + labels: + provider: "$1" +``` + +The metric name can also contain references to regex matches. The mapping above +could be written as: + +```yaml +mappings: +- match: "test\\.(\\w+)\\.(\\w+)\\.counter" + match_type: regex + name: "${2}_total" + labels: + provider: "$1" +``` + +Be aware about yaml escape rules as a mapping like the following one will not work. +```yaml +mappings: +- match: "test\.(\w+)\.(\w+)\.counter" + match_type: regex + name: "${2}_total" + labels: + provider: "$1" +``` + +Please note that metrics with the same name must also have the same set of +label names. + +If the default metric help text is insufficient for your needs you may use the YAML +configuration to specify a custom help text for each mapping: + +```yaml +mappings: +- match: "http.request.*" + help: "Total number of http requests" + name: "http_requests_total" + labels: + code: "$1" +``` + +### StatsD timers + +By default, statsd timers are represented as a Prometheus summary with +quantiles. You may optionally configure the [quantiles and acceptable +error](https://prometheus.io/docs/practices/histograms/#quantiles), as +well as adjusting how the summary metric is aggregated: + +```yaml +mappings: +- match: "test.timing.*.*.*" + timer_type: summary + name: "my_timer" + labels: + provider: "$2" + outcome: "$3" + job: "${1}_server" + summary_options: + quantiles: + - quantile: 0.99 + error: 0.001 + - quantile: 0.95 + error: 0.01 + - quantile: 0.9 + error: 0.05 + - quantile: 0.5 + error: 0.005 + max_summary_age: 30s + summary_age_buckets: 3 + stream_buffer_size: 1000 +``` + +The default quantiles are 0.99, 0.9, and 0.5. + +The default summary age is 10 minutes, the default number of buckets +is 5 and the default buffer size is 500. See also the +[`golang_client` docs](https://godoc.org/github.com/prometheus/client_golang/prometheus#SummaryOpts). +The `max_summary_age` corresponds to `SummaryOptions.MaxAge`, `summary_age_buckets` +to `SummaryOptions.AgeBuckets` and `stream_buffer_size` to `SummaryOptions.BufCap`. + +In the configuration, one may also set the timer type to "histogram". The +default is "summary" as in the plain text configuration format. For example, +to set the timer type for a single metric: + +```yaml +mappings: +- match: "test.timing.*.*.*" + timer_type: histogram + histogram_options: + buckets: [ 0.01, 0.025, 0.05, 0.1 ] + name: "my_timer" + labels: + provider: "$2" + outcome: "$3" + job: "${1}_server" +``` + +Note that timers will be accepted with the `ms`, `h`, and `d` statsd types. The first two are timers and histograms and the `d` type is for DataDog's "distribution" type. The distribution type is treated identically to timers and histograms. + +It should be noted that whereas timers in statsd expects the unit of timing data to be in milliseconds, +prometheus expects the unit to be seconds. Hence, the exporter converts all timers to seconds +before exporting them. + +### DogStatsD Client Behavior + +#### `timed()` decorator + +If you are using the DogStatsD client's [timed](https://datadogpy.readthedocs.io/en/latest/#datadog.threadstats.base.ThreadStats.timed) decorator, +it emits the metric in seconds, set [use_ms](https://datadogpy.readthedocs.io/en/latest/index.html?highlight=use_ms) to `True` to fix this. + +### Regular expression matching + +Another capability when using YAML configuration is the ability to define matches +using raw regular expressions as opposed to the default globbing style of match. +This may allow for pulling structured data from otherwise poorly named statsd +metrics AND allow for more precise targetting of match rules. When no `match_type` +paramter is specified the default value of `glob` will be assumed: + +```yaml +mappings: +- match: "(.*)\.(.*)--(.*)\.status\.(.*)\.count" + match_type: regex + name: "request_total" + labels: + hostname: "$1" + exec: "$2" + protocol: "$3" + code: "$4" +``` + +Note, that one may also set the histogram buckets. If not set, then the default +[Prometheus client values](https://godoc.org/github.com/prometheus/client_golang/prometheus#pkg-variables) are used: `[.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10]`. `+Inf` is added +automatically. + +`timer_type` is only used when the statsd metric type is a timer. `buckets` is +only used when the statsd metric type is a timerand the `timer_type` is set to +"histogram." + +### Global defaults + +One may also set defaults for the timer type, buckets or quantiles, and match_type. These will be used +by all mappings that do not define these. + +An option that can only be configured in `defaults` is `glob_disable_ordering`, which is `false` if omitted. By setting this to `true`, `glob` match type will not honor the occurance of rules in the mapping rules file and always treat `*` as lower priority than a general string. + +```yaml +defaults: + timer_type: histogram + buckets: [.005, .01, .025, .05, .1, .25, .5, 1, 2.5 ] + match_type: glob + glob_disable_ordering: false + ttl: 0 # metrics do not expire +mappings: +# This will be a histogram using the buckets set in `defaults`. +- match: "test.timing.*.*.*" + name: "my_timer" + labels: + provider: "$2" + outcome: "$3" + job: "${1}_server" +# This will be a summary timer. +- match: "other.timing.*.*.*" + timer_type: summary + name: "other_timer" + labels: + provider: "$2" + outcome: "$3" + job: "${1}_server_other" +``` + +### Choosing between glob or regex match type + +Despite from the missing flexibility of using regular expression in mapping and +formatting labels, `glob` matching is optimized to have better performance than +`regex` in certain use cases. In short, glob will have best performance if the +rules amount is not so less and captures (using of `*`) is not to much in a +single rule. Whether disabling ordering in glob or not won't have a noticable +effect on performance in general use cases. In edge cases like the below however, +disabling ordering will be beneficial: + + a.*.*.*.* + a.b.*.*.* + a.b.c.*.* + a.b.c.d.* + +The reason is that the list assignment of captures (using of `*`) is the most +expensive operation in glob. Honoring ordering will result in up to 10 list +assignments, while without ordering it will need only 4 at most. + +For details, see [pkg/mapper/fsm/README.md](pkg/mapper/fsm/README.md). +Running `go test -bench .` in **pkg/mapper** directory will produce +a detailed comparison between the two match type. + +### `drop` action + +You may also drop metrics by specifying a "drop" action on a match. For +example: + +```yaml +mappings: +# This metric would match as normal. +- match: "test.timing.*.*.*" + name: "my_timer" + labels: + provider: "$2" + outcome: "$3" + job: "${1}_server" +# Any metric not matched will be dropped because "." matches all metrics. +- match: "." + match_type: regex + action: drop + name: "dropped" +``` + +You can drop any metric using the normal match syntax. +The default action is "map" which does the normal metrics mapping. + +### Explicit metric type mapping + +StatsD allows emitting of different metric types under the same metric name, +but the Prometheus client library can't merge those. For this use-case the +mapping definition allows you to specify which metric type to match: + +``` +mappings: +- match: "test.foo.*" + name: "test_foo" + match_metric_type: counter + labels: + provider: "$1" +``` + +Possible values for `match_metric_type` are `gauge`, `counter` and `timer`. + +### Mapping cache size and cache replacement policy + +There is a cache used to improve the performance of the metric mapping, that can greatly improvement performance. +The cache has a default maximum of 1000 unique statsd metric names -> prometheus metrics mappings that it can store. +This maximum can be adjust using the `statsd.cache-size` flag. + +If the maximum is reached, entries are by default rotated using the [least recently used replacement policy](https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)). This strategy is optimal when memory is constrained as only the most recent entries are retained. + +Alternatively, you can choose a [random-replacement cache strategy](https://en.wikipedia.org/wiki/Cache_replacement_policies#Random_replacement_(RR)). This is less optimal if the cache is smaller than the cacheable set, but requires less locking. Use this for very high throughput, but make sure to allow for a cache that holds all metrics. + +The optimal cache size is determined by the cardinality of the _incoming_ metrics. + +### Time series expiration + +The `ttl` parameter can be used to define the expiration time for stale metrics. +The value is a time duration with valid time units: "ns", "us" (or "µs"), +"ms", "s", "m", "h". For example, `ttl: 1m20s`. `0` value is used to indicate +metrics that do not expire. + + TTL configuration is stored for each mapped metric name/labels combination + whenever new samples are received. This means that you cannot immediately + expire a metric only by changing the mapping configuration. At least one + sample must be received for updated mappings to take effect. + + ### Event flushing configuration + + Internally `statsd_exporter` runs a goroutine for each network listener (UDP, TCP & Unix Socket). These each receive and parse metrics received into an event. For performance purposes, these events are queued internally and flushed to the main exporter goroutine periodically in batches. The size of this queue and the flush criteria can be tuned with the `--statsd.event-queue-size`, `--statsd.event-flush-threshold` and `--statsd.event-flush-interval`. However, the defaults should perform well even for very high traffic environments. + +## Using Docker + +You can deploy this exporter using the [prom/statsd-exporter](https://registry.hub.docker.com/r/prom/statsd-exporter) Docker image. + +For example: + +```bash +docker pull prom/statsd-exporter + +docker run -d -p 9102:9102 -p 9125:9125 -p 9125:9125/udp \ + -v $PWD/statsd_mapping.yml:/tmp/statsd_mapping.yml \ + prom/statsd-exporter --statsd.mapping-config=/tmp/statsd_mapping.yml +``` + + +[travis]: https://travis-ci.org/prometheus/statsd_exporter +[circleci]: https://circleci.com/gh/prometheus/statsd_exporter +[quay]: https://quay.io/repository/prometheus/statsd-exporter +[hub]: https://hub.docker.com/r/prom/statsd-exporter/ diff --git a/VERSION b/VERSION index a551051..31d7b1a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.15.0 +0.15.0 diff --git a/bridge_test.go b/bridge_test.go index c8862df..221adfb 100644 --- a/bridge_test.go +++ b/bridge_test.go @@ -1,442 +1,444 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "reflect" - "testing" - - "github.com/go-kit/kit/log" -) - -func TestHandlePacket(t *testing.T) { - scenarios := []struct { - name string - in string - out Events - }{ - { - name: "empty", - }, { - name: "simple counter", - in: "foo:2|c", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 2, - labels: map[string]string{}, - }, - }, - }, { - name: "simple gauge", - in: "foo:3|g", - out: Events{ - &GaugeEvent{ - metricName: "foo", - value: 3, - labels: map[string]string{}, - }, - }, - }, { - name: "gauge with sampling", - in: "foo:3|g|@0.2", - out: Events{ - &GaugeEvent{ - metricName: "foo", - value: 3, - labels: map[string]string{}, - }, - }, - }, { - name: "gauge decrement", - in: "foo:-10|g", - out: Events{ - &GaugeEvent{ - metricName: "foo", - value: -10, - relative: true, - labels: map[string]string{}, - }, - }, - }, { - name: "simple timer", - in: "foo:200|ms", - out: Events{ - &TimerEvent{ - metricName: "foo", - value: 200, - labels: map[string]string{}, - }, - }, - }, { - name: "simple histogram", - in: "foo:200|h", - out: Events{ - &TimerEvent{ - metricName: "foo", - value: 200, - labels: map[string]string{}, - }, - }, - }, { - name: "simple distribution", - in: "foo:200|d", - out: Events{ - &TimerEvent{ - metricName: "foo", - value: 200, - labels: map[string]string{}, - }, - }, - }, { - name: "distribution with sampling", - in: "foo:0.01|d|@0.2|#tag1:bar,#tag2:baz", - out: Events{ - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - }, - }, { - name: "librato tag extension", - in: "foo#tag1=bar,tag2=baz:100|c", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - }, - }, { - name: "librato tag extension with tag keys unsupported by prometheus", - in: "foo#09digits=0,tag.with.dots=1:100|c", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{"_09digits": "0", "tag_with_dots": "1"}, - }, - }, - }, { - name: "influxdb tag extension", - in: "foo,tag1=bar,tag2=baz:100|c", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - }, - }, { - name: "influxdb tag extension with tag keys unsupported by prometheus", - in: "foo,09digits=0,tag.with.dots=1:100|c", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{"_09digits": "0", "tag_with_dots": "1"}, - }, - }, - }, { - name: "datadog tag extension", - in: "foo:100|c|#tag1:bar,tag2:baz", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - }, - }, { - name: "datadog tag extension with # in all keys (as sent by datadog php client)", - in: "foo:100|c|#tag1:bar,#tag2:baz", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - }, - }, { - name: "datadog tag extension with tag keys unsupported by prometheus", - in: "foo:100|c|#09digits:0,tag.with.dots:1", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{"_09digits": "0", "tag_with_dots": "1"}, - }, - }, - }, { - name: "datadog tag extension with valueless tags: ignored", - in: "foo:100|c|#tag_without_a_value", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{}, - }, - }, - }, { - name: "datadog tag extension with valueless tags (edge case)", - in: "foo:100|c|#tag_without_a_value,tag:value", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{"tag": "value"}, - }, - }, - }, { - name: "datadog tag extension with empty tags (edge case)", - in: "foo:100|c|#tag:value,,", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 100, - labels: map[string]string{"tag": "value"}, - }, - }, - }, { - name: "datadog tag extension with sampling", - in: "foo:100|c|@0.1|#tag1:bar,#tag2:baz", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 1000, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - }, - }, { - name: "librato/dogstatsd mixed tag styles without sampling", - in: "foo#tag1=foo,tag3=bing:100|c|#tag1:bar,#tag2:baz", - out: Events{}, - }, { - name: "influxdb/dogstatsd mixed tag styles without sampling", - in: "foo,tag1=foo,tag3=bing:100|c|#tag1:bar,#tag2:baz", - out: Events{}, - }, { - name: "mixed tag styles with sampling", - in: "foo#tag1=foo,tag3=bing:100|c|@0.1|#tag1:bar,#tag2:baz", - out: Events{}, - }, { - name: "histogram with sampling", - in: "foo:0.01|h|@0.2|#tag1:bar,#tag2:baz", - out: Events{ - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - &TimerEvent{ - metricName: "foo", - value: 0.01, - labels: map[string]string{"tag1": "bar", "tag2": "baz"}, - }, - }, - }, { - name: "datadog tag extension with multiple colons", - in: "foo:100|c|@0.1|#tag1:foo:bar", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 1000, - labels: map[string]string{"tag1": "foo:bar"}, - }, - }, - }, { - name: "datadog tag extension with invalid utf8 tag values", - in: "foo:100|c|@0.1|#tag:\xc3\x28invalid", - }, { - name: "datadog tag extension with both valid and invalid utf8 tag values", - in: "foo:100|c|@0.1|#tag1:valid,tag2:\xc3\x28invalid", - }, { - name: "multiple metrics with invalid datadog utf8 tag values", - in: "foo:200|c|#tag:value\nfoo:300|c|#tag:\xc3\x28invalid", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 200, - labels: map[string]string{"tag": "value"}, - }, - }, - }, { - name: "combined multiline metrics", - in: "foo:200|ms:300|ms:5|c|@0.1:6|g\nbar:1|c:5|ms", - out: Events{ - &TimerEvent{ - metricName: "foo", - value: 200, - labels: map[string]string{}, - }, - &TimerEvent{ - metricName: "foo", - value: 300, - labels: map[string]string{}, - }, - &CounterEvent{ - metricName: "foo", - value: 50, - labels: map[string]string{}, - }, - &GaugeEvent{ - metricName: "foo", - value: 6, - labels: map[string]string{}, - }, - &CounterEvent{ - metricName: "bar", - value: 1, - labels: map[string]string{}, - }, - &TimerEvent{ - metricName: "bar", - value: 5, - labels: map[string]string{}, - }, - }, - }, { - name: "timings with sampling factor", - in: "foo.timing:0.5|ms|@0.1", - out: Events{ - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - &TimerEvent{metricName: "foo.timing", value: 0.5, labels: map[string]string{}}, - }, - }, { - name: "bad line", - in: "foo", - }, { - name: "bad component", - in: "foo:1", - }, { - name: "bad value", - in: "foo:1o|c", - }, { - name: "illegal sampling factor", - in: "foo:1|c|@bar", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 1, - labels: map[string]string{}, - }, - }, - }, { - name: "zero sampling factor", - in: "foo:2|c|@0", - out: Events{ - &CounterEvent{ - metricName: "foo", - value: 2, - labels: map[string]string{}, - }, - }, - }, { - name: "illegal stat type", - in: "foo:2|t", - }, - { - name: "empty metric name", - in: ":100|ms", - }, - { - name: "empty component", - in: "foo:1|c|", - }, - { - name: "invalid utf8", - in: "invalid\xc3\x28utf8:1|c", - }, - { - name: "some invalid utf8", - in: "valid_utf8:1|c\ninvalid\xc3\x28utf8:1|c", - out: Events{ - &CounterEvent{ - metricName: "valid_utf8", - value: 1, - labels: map[string]string{}, - }, - }, - }, - } - - for k, l := range []statsDPacketHandler{&StatsDUDPListener{nil, nil, log.NewNopLogger()}, &mockStatsDTCPListener{StatsDTCPListener{nil, nil, log.NewNopLogger()}, log.NewNopLogger()}} { - events := make(chan Events, 32) - l.SetEventHandler(&unbufferedEventHandler{c: events}) - for i, scenario := range scenarios { - l.handlePacket([]byte(scenario.in)) - - le := len(events) - // Flatten actual events. - actual := Events{} - for i := 0; i < le; i++ { - actual = append(actual, <-events...) - } - - if len(actual) != len(scenario.out) { - t.Fatalf("%d.%d. Expected %d events, got %d in scenario '%s'", k, i, len(scenario.out), len(actual), scenario.name) - } - - for j, expected := range scenario.out { - if !reflect.DeepEqual(&expected, &actual[j]) { - t.Fatalf("%d.%d.%d. Expected %#v, got %#v in scenario '%s'", k, i, j, expected, actual[j], scenario.name) - } - } - } - } -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "reflect" + "testing" + + "github.com/go-kit/kit/log" + "github.com/prometheus/statsd_exporter/pkg/event" + "github.com/prometheus/statsd_exporter/pkg/listener" +) + +func TestHandlePacket(t *testing.T) { + scenarios := []struct { + name string + in string + out event.Events + }{ + { + name: "empty", + }, { + name: "simple counter", + in: "foo:2|c", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 2, + CLabels: map[string]string{}, + }, + }, + }, { + name: "simple gauge", + in: "foo:3|g", + out: event.Events{ + &event.GaugeEvent{ + GMetricName: "foo", + GValue: 3, + GLabels: map[string]string{}, + }, + }, + }, { + name: "gauge with sampling", + in: "foo:3|g|@0.2", + out: event.Events{ + &event.GaugeEvent{ + GMetricName: "foo", + GValue: 3, + GLabels: map[string]string{}, + }, + }, + }, { + name: "gauge decrement", + in: "foo:-10|g", + out: event.Events{ + &event.GaugeEvent{ + GMetricName: "foo", + GValue: -10, + GRelative: true, + GLabels: map[string]string{}, + }, + }, + }, { + name: "simple timer", + in: "foo:200|ms", + out: event.Events{ + &event.TimerEvent{ + TMetricName: "foo", + TValue: 200, + TLabels: map[string]string{}, + }, + }, + }, { + name: "simple histogram", + in: "foo:200|h", + out: event.Events{ + &event.TimerEvent{ + TMetricName: "foo", + TValue: 200, + TLabels: map[string]string{}, + }, + }, + }, { + name: "simple distribution", + in: "foo:200|d", + out: event.Events{ + &event.TimerEvent{ + TMetricName: "foo", + TValue: 200, + TLabels: map[string]string{}, + }, + }, + }, { + name: "distribution with sampling", + in: "foo:0.01|d|@0.2|#tag1:bar,#tag2:baz", + out: event.Events{ + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + }, + }, { + name: "librato tag extension", + in: "foo#tag1=bar,tag2=baz:100|c", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + }, + }, { + name: "librato tag extension with tag keys unsupported by prometheus", + in: "foo#09digits=0,tag.with.dots=1:100|c", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{"_09digits": "0", "tag_with_dots": "1"}, + }, + }, + }, { + name: "influxdb tag extension", + in: "foo,tag1=bar,tag2=baz:100|c", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + }, + }, { + name: "influxdb tag extension with tag keys unsupported by prometheus", + in: "foo,09digits=0,tag.with.dots=1:100|c", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{"_09digits": "0", "tag_with_dots": "1"}, + }, + }, + }, { + name: "datadog tag extension", + in: "foo:100|c|#tag1:bar,tag2:baz", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + }, + }, { + name: "datadog tag extension with # in all keys (as sent by datadog php client)", + in: "foo:100|c|#tag1:bar,#tag2:baz", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + }, + }, { + name: "datadog tag extension with tag keys unsupported by prometheus", + in: "foo:100|c|#09digits:0,tag.with.dots:1", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{"_09digits": "0", "tag_with_dots": "1"}, + }, + }, + }, { + name: "datadog tag extension with valueless tags: ignored", + in: "foo:100|c|#tag_without_a_value", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{}, + }, + }, + }, { + name: "datadog tag extension with valueless tags (edge case)", + in: "foo:100|c|#tag_without_a_value,tag:value", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{"tag": "value"}, + }, + }, + }, { + name: "datadog tag extension with empty tags (edge case)", + in: "foo:100|c|#tag:value,,", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{"tag": "value"}, + }, + }, + }, { + name: "datadog tag extension with sampling", + in: "foo:100|c|@0.1|#tag1:bar,#tag2:baz", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 1000, + CLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + }, + }, { + name: "librato/dogstatsd mixed tag styles without sampling", + in: "foo#tag1=foo,tag3=bing:100|c|#tag1:bar,#tag2:baz", + out: event.Events{}, + }, { + name: "influxdb/dogstatsd mixed tag styles without sampling", + in: "foo,tag1=foo,tag3=bing:100|c|#tag1:bar,#tag2:baz", + out: event.Events{}, + }, { + name: "mixed tag styles with sampling", + in: "foo#tag1=foo,tag3=bing:100|c|@0.1|#tag1:bar,#tag2:baz", + out: event.Events{}, + }, { + name: "histogram with sampling", + in: "foo:0.01|h|@0.2|#tag1:bar,#tag2:baz", + out: event.Events{ + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.01, + TLabels: map[string]string{"tag1": "bar", "tag2": "baz"}, + }, + }, + }, { + name: "datadog tag extension with multiple colons", + in: "foo:100|c|@0.1|#tag1:foo:bar", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 1000, + CLabels: map[string]string{"tag1": "foo:bar"}, + }, + }, + }, { + name: "datadog tag extension with invalid utf8 tag values", + in: "foo:100|c|@0.1|#tag:\xc3\x28invalid", + }, { + name: "datadog tag extension with both valid and invalid utf8 tag values", + in: "foo:100|c|@0.1|#tag1:valid,tag2:\xc3\x28invalid", + }, { + name: "multiple metrics with invalid datadog utf8 tag values", + in: "foo:200|c|#tag:value\nfoo:300|c|#tag:\xc3\x28invalid", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 200, + CLabels: map[string]string{"tag": "value"}, + }, + }, + }, { + name: "combined multiline metrics", + in: "foo:200|ms:300|ms:5|c|@0.1:6|g\nbar:1|c:5|ms", + out: event.Events{ + &event.TimerEvent{ + TMetricName: "foo", + TValue: 200, + TLabels: map[string]string{}, + }, + &event.TimerEvent{ + TMetricName: "foo", + TValue: 300, + TLabels: map[string]string{}, + }, + &event.CounterEvent{ + CMetricName: "foo", + CValue: 50, + CLabels: map[string]string{}, + }, + &event.GaugeEvent{ + GMetricName: "foo", + GValue: 6, + GLabels: map[string]string{}, + }, + &event.CounterEvent{ + CMetricName: "bar", + CValue: 1, + CLabels: map[string]string{}, + }, + &event.TimerEvent{ + TMetricName: "bar", + TValue: 5, + TLabels: map[string]string{}, + }, + }, + }, { + name: "timings with sampling factor", + in: "foo.timing:0.5|ms|@0.1", + out: event.Events{ + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + }, + }, { + name: "bad line", + in: "foo", + }, { + name: "bad component", + in: "foo:1", + }, { + name: "bad value", + in: "foo:1o|c", + }, { + name: "illegal sampling factor", + in: "foo:1|c|@bar", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 1, + CLabels: map[string]string{}, + }, + }, + }, { + name: "zero sampling factor", + in: "foo:2|c|@0", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: 2, + CLabels: map[string]string{}, + }, + }, + }, { + name: "illegal stat type", + in: "foo:2|t", + }, + { + name: "empty metric name", + in: ":100|ms", + }, + { + name: "empty component", + in: "foo:1|c|", + }, + { + name: "invalid utf8", + in: "invalid\xc3\x28utf8:1|c", + }, + { + name: "some invalid utf8", + in: "valid_utf8:1|c\ninvalid\xc3\x28utf8:1|c", + out: event.Events{ + &event.CounterEvent{ + CMetricName: "valid_utf8", + CValue: 1, + CLabels: map[string]string{}, + }, + }, + }, + } + + for k, l := range []statsDPacketHandler{&listener.StatsDUDPListener{nil, nil, log.NewNopLogger()}, &mockStatsDTCPListener{listener.StatsDTCPListener{nil, nil, log.NewNopLogger()}, log.NewNopLogger()}} { + events := make(chan event.Events, 32) + l.SetEventHandler(&event.UnbufferedEventHandler{C: events}) + for i, scenario := range scenarios { + l.HandlePacket([]byte(scenario.in), udpPackets, linesReceived, eventsFlushed, *sampleErrors, samplesReceived, tagErrors, tagsReceived) + + le := len(events) + // Flatten actual events. + actual := event.Events{} + for i := 0; i < le; i++ { + actual = append(actual, <-events...) + } + + if len(actual) != len(scenario.out) { + t.Fatalf("%d.%d. Expected %d events, got %d in scenario '%s'", k, i, len(scenario.out), len(actual), scenario.name) + } + + for j, expected := range scenario.out { + if !reflect.DeepEqual(&expected, &actual[j]) { + t.Fatalf("%d.%d.%d. Expected %#v, got %#v in scenario '%s'", k, i, j, expected, actual[j], scenario.name) + } + } + } + } +} diff --git a/event_test.go b/event_test.go index 97a2722..e207b61 100644 --- a/event_test.go +++ b/event_test.go @@ -1,80 +1,81 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "testing" - "time" - - "github.com/prometheus/statsd_exporter/pkg/clock" -) - -func TestEventThresholdFlush(t *testing.T) { - c := make(chan Events, 100) - // We're not going to flush during this test, so the duration doesn't matter. - eq := newEventQueue(c, 5, time.Second) - e := make(Events, 13) - go func() { - eq.queue(e) - }() - - batch := <-c - if len(batch) != 5 { - t.Fatalf("Expected event batch to be 5 elements, but got %v", len(batch)) - } - batch = <-c - if len(batch) != 5 { - t.Fatalf("Expected event batch to be 5 elements, but got %v", len(batch)) - } - batch = <-c - if len(batch) != 3 { - t.Fatalf("Expected event batch to be 3 elements, but got %v", len(batch)) - } -} - -func TestEventIntervalFlush(t *testing.T) { - // Mock a time.NewTicker - tickerCh := make(chan time.Time) - clock.ClockInstance = &clock.Clock{ - TickerCh: tickerCh, - } - clock.ClockInstance.Instant = time.Unix(0, 0) - - c := make(chan Events, 100) - eq := newEventQueue(c, 1000, time.Second*1000) - e := make(Events, 10) - eq.queue(e) - - if eq.len() != 10 { - t.Fatal("Expected 10 events to be queued, but got", eq.len()) - } - - if len(eq.c) != 0 { - t.Fatal("Expected 0 events in the event channel, but got", len(eq.c)) - } - - // Tick time forward to trigger a flush - clock.ClockInstance.Instant = time.Unix(10000, 0) - clock.ClockInstance.TickerCh <- time.Unix(10000, 0) - - events := <-eq.c - if eq.len() != 0 { - t.Fatal("Expected 0 events to be queued, but got", eq.len()) - } - - if len(events) != 10 { - t.Fatal("Expected 10 events in the event channel, but got", len(events)) - } - -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "testing" + "time" + + "github.com/prometheus/statsd_exporter/pkg/clock" + "github.com/prometheus/statsd_exporter/pkg/event" +) + +func TestEventThresholdFlush(t *testing.T) { + c := make(chan event.Events, 100) + // We're not going to flush during this test, so the duration doesn't matter. + eq := event.NewEventQueue(c, 5, time.Second, eventsFlushed) + e := make(event.Events, 13) + go func() { + eq.Queue(e, &eventsFlushed) + }() + + batch := <-c + if len(batch) != 5 { + t.Fatalf("Expected event batch to be 5 elements, but got %v", len(batch)) + } + batch = <-c + if len(batch) != 5 { + t.Fatalf("Expected event batch to be 5 elements, but got %v", len(batch)) + } + batch = <-c + if len(batch) != 3 { + t.Fatalf("Expected event batch to be 3 elements, but got %v", len(batch)) + } +} + +func TestEventIntervalFlush(t *testing.T) { + // Mock a time.NewTicker + tickerCh := make(chan time.Time) + clock.ClockInstance = &clock.Clock{ + TickerCh: tickerCh, + } + clock.ClockInstance.Instant = time.Unix(0, 0) + + c := make(chan event.Events, 100) + eq := event.NewEventQueue(c, 1000, time.Second*1000, eventsFlushed) + e := make(event.Events, 10) + eq.Queue(e, &eventsFlushed) + + if eq.Len() != 10 { + t.Fatal("Expected 10 events to be queued, but got", eq.Len()) + } + + if len(eq.C) != 0 { + t.Fatal("Expected 0 events in the event channel, but got", len(eq.C)) + } + + // Tick time forward to trigger a flush + clock.ClockInstance.Instant = time.Unix(10000, 0) + clock.ClockInstance.TickerCh <- time.Unix(10000, 0) + + events := <-eq.C + if eq.Len() != 0 { + t.Fatal("Expected 0 events to be queued, but got", eq.Len()) + } + + if len(events) != 10 { + t.Fatal("Expected 10 events in the event channel, but got", len(events)) + } + +} diff --git a/exporter_benchmark_test.go b/exporter_benchmark_test.go index 1c86479..170539c 100644 --- a/exporter_benchmark_test.go +++ b/exporter_benchmark_test.go @@ -1,154 +1,157 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "fmt" - "testing" - - "github.com/go-kit/kit/log" - "github.com/prometheus/statsd_exporter/pkg/mapper" -) - -func benchmarkUDPListener(times int, b *testing.B) { - input := []string{ - "foo1:2|c", - "foo2:3|g", - "foo3:200|ms", - "foo4:100|c|#tag1:bar,tag2:baz", - "foo5:100|c|#tag1:bar,#tag2:baz", - "foo6:100|c|#09digits:0,tag.with.dots:1", - "foo10:100|c|@0.1|#tag1:bar,#tag2:baz", - "foo11:100|c|@0.1|#tag1:foo:bar", - "foo15:200|ms:300|ms:5|c|@0.1:6|g\nfoo15a:1|c:5|ms", - "some_very_useful_metrics_with_quite_a_log_name:13|c", - } - bytesInput := make([]string, len(input)*times) - for run := 0; run < times; run++ { - for i := 0; i < len(input); i++ { - bytesInput[run*len(input)+i] = fmt.Sprintf("run%d%s", run, input[i]) - } - } - for n := 0; n < b.N; n++ { - // there are more events than input lines, need bigger buffer - events := make(chan Events, len(bytesInput)*times*2) - l := StatsDUDPListener{eventHandler: &unbufferedEventHandler{c: events}} - - for i := 0; i < times; i++ { - for _, line := range bytesInput { - l.handlePacket([]byte(line)) - } - } - } -} - -func BenchmarkUDPListener1(b *testing.B) { - benchmarkUDPListener(1, b) -} -func BenchmarkUDPListener5(b *testing.B) { - benchmarkUDPListener(5, b) -} -func BenchmarkUDPListener50(b *testing.B) { - benchmarkUDPListener(50, b) -} - -func BenchmarkExporterListener(b *testing.B) { - events := Events{ - &CounterEvent{ // simple counter - metricName: "counter", - value: 2, - }, - &GaugeEvent{ // simple gauge - metricName: "gauge", - value: 10, - }, - &TimerEvent{ // simple timer - metricName: "timer", - value: 200, - }, - &TimerEvent{ // simple histogram - metricName: "histogram.test", - value: 200, - }, - &CounterEvent{ // simple_tags - metricName: "simple_tags", - value: 100, - labels: map[string]string{ - "alpha": "bar", - "bravo": "baz", - }, - }, - &CounterEvent{ // slightly different tags - metricName: "simple_tags", - value: 100, - labels: map[string]string{ - "alpha": "bar", - "charlie": "baz", - }, - }, - &CounterEvent{ // and even more different tags - metricName: "simple_tags", - value: 100, - labels: map[string]string{ - "alpha": "bar", - "bravo": "baz", - "golf": "looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong", - }, - }, - &CounterEvent{ // datadog tag extension with complex tags - metricName: "foo", - value: 100, - labels: map[string]string{ - "action": "test", - "application": "testapp", - "application_component": "testcomp", - "application_role": "test_role", - "category": "category", - "controller": "controller", - "deployed_to": "production", - "kube_deployment": "deploy", - "kube_namespace": "kube-production", - "method": "get", - "version": "5.2.8374", - "status": "200", - "status_range": "2xx", - }, - }, - } - config := ` -mappings: -- match: histogram.test - timer_type: histogram - name: "histogram_test" -` - - testMapper := &mapper.MetricMapper{} - err := testMapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - ex := NewExporter(testMapper, log.NewNopLogger()) - for i := 0; i < b.N; i++ { - ec := make(chan Events, 1000) - go func() { - for i := 0; i < 1000; i++ { - ec <- events - } - close(ec) - }() - - ex.Listen(ec) - } -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "fmt" + "testing" + + "github.com/go-kit/kit/log" + "github.com/prometheus/statsd_exporter/pkg/event" + "github.com/prometheus/statsd_exporter/pkg/exporter" + "github.com/prometheus/statsd_exporter/pkg/listener" + "github.com/prometheus/statsd_exporter/pkg/mapper" +) + +func benchmarkUDPListener(times int, b *testing.B) { + input := []string{ + "foo1:2|c", + "foo2:3|g", + "foo3:200|ms", + "foo4:100|c|#tag1:bar,tag2:baz", + "foo5:100|c|#tag1:bar,#tag2:baz", + "foo6:100|c|#09digits:0,tag.with.dots:1", + "foo10:100|c|@0.1|#tag1:bar,#tag2:baz", + "foo11:100|c|@0.1|#tag1:foo:bar", + "foo15:200|ms:300|ms:5|c|@0.1:6|g\nfoo15a:1|c:5|ms", + "some_very_useful_metrics_with_quite_a_log_name:13|c", + } + bytesInput := make([]string, len(input)*times) + for run := 0; run < times; run++ { + for i := 0; i < len(input); i++ { + bytesInput[run*len(input)+i] = fmt.Sprintf("run%d%s", run, input[i]) + } + } + for n := 0; n < b.N; n++ { + // there are more events than input lines, need bigger buffer + events := make(chan event.Events, len(bytesInput)*times*2) + l := listener.StatsDUDPListener{EventHandler: &event.UnbufferedEventHandler{C: events}} + + for i := 0; i < times; i++ { + for _, line := range bytesInput { + l.HandlePacket([]byte(line), udpPackets, linesReceived, eventsFlushed, *sampleErrors, samplesReceived, tagErrors, tagsReceived) + } + } + } +} + +func BenchmarkUDPListener1(b *testing.B) { + benchmarkUDPListener(1, b) +} +func BenchmarkUDPListener5(b *testing.B) { + benchmarkUDPListener(5, b) +} +func BenchmarkUDPListener50(b *testing.B) { + benchmarkUDPListener(50, b) +} + +func BenchmarkExporterListener(b *testing.B) { + events := event.Events{ + &event.CounterEvent{ // simple counter + CMetricName: "counter", + CValue: 2, + }, + &event.GaugeEvent{ // simple gauge + GMetricName: "gauge", + GValue: 10, + }, + &event.TimerEvent{ // simple timer + TMetricName: "timer", + TValue: 200, + }, + &event.TimerEvent{ // simple histogram + TMetricName: "histogram.test", + TValue: 200, + }, + &event.CounterEvent{ // simple_tags + CMetricName: "simple_tags", + CValue: 100, + CLabels: map[string]string{ + "alpha": "bar", + "bravo": "baz", + }, + }, + &event.CounterEvent{ // slightly different tags + CMetricName: "simple_tags", + CValue: 100, + CLabels: map[string]string{ + "alpha": "bar", + "charlie": "baz", + }, + }, + &event.CounterEvent{ // and even more different tags + CMetricName: "simple_tags", + CValue: 100, + CLabels: map[string]string{ + "alpha": "bar", + "bravo": "baz", + "golf": "looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong", + }, + }, + &event.CounterEvent{ // datadog tag extension with complex tags + CMetricName: "foo", + CValue: 100, + CLabels: map[string]string{ + "action": "test", + "application": "testapp", + "application_component": "testcomp", + "application_role": "test_role", + "category": "category", + "controller": "controller", + "deployed_to": "production", + "kube_deployment": "deploy", + "kube_namespace": "kube-production", + "method": "get", + "version": "5.2.8374", + "status": "200", + "status_range": "2xx", + }, + }, + } + config := ` +mappings: +- match: histogram.test + timer_type: histogram + name: "histogram_test" +` + + testMapper := &mapper.MetricMapper{} + err := testMapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + ex := exporter.NewExporter(testMapper, log.NewNopLogger()) + for i := 0; i < b.N; i++ { + ec := make(chan event.Events, 1000) + go func() { + for i := 0; i < 1000; i++ { + ec <- events + } + close(ec) + }() + + ex.Listen(ec, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + } +} diff --git a/exporter_test.go b/exporter_test.go index c64a5a2..4b9fa61 100644 --- a/exporter_test.go +++ b/exporter_test.go @@ -1,964 +1,969 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "fmt" - "net" - "testing" - "time" - - "github.com/go-kit/kit/log" - "github.com/prometheus/client_golang/prometheus" - dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/statsd_exporter/pkg/clock" - "github.com/prometheus/statsd_exporter/pkg/mapper" -) - -// TestNegativeCounter validates when we send a negative -// number to a counter that we no longer panic the Exporter Listener. -func TestNegativeCounter(t *testing.T) { - defer func() { - if e := recover(); e != nil { - err := e.(error) - if err.Error() == "counter cannot decrease in value" { - t.Fatalf("Counter was negative and causes a panic.") - } else { - t.Fatalf("Unknown panic and error: %q", err.Error()) - } - } - }() - - events := make(chan Events) - go func() { - c := Events{ - &CounterEvent{ - metricName: "foo", - value: -1, - }, - } - events <- c - close(events) - }() - - errorCounter := errorEventStats.WithLabelValues("illegal_negative_counter") - prev := getTelemetryCounterValue(errorCounter) - - testMapper := mapper.MetricMapper{} - testMapper.InitCache(0) - - ex := NewExporter(&testMapper, log.NewNopLogger()) - ex.Listen(events) - - updated := getTelemetryCounterValue(errorCounter) - if updated-prev != 1 { - t.Fatal("Illegal negative counter error not counted") - } -} - -// TestInconsistentLabelSets validates that the exporter will register -// and record metrics with the same metric name but inconsistent label -// sets e.g foo{a="1"} and foo{b="1"} -func TestInconsistentLabelSets(t *testing.T) { - firstLabelSet := make(map[string]string) - secondLabelSet := make(map[string]string) - metricNames := [4]string{"counter_test", "gauge_test", "histogram_test", "summary_test"} - - firstLabelSet["foo"] = "1" - secondLabelSet["foo"] = "1" - secondLabelSet["bar"] = "2" - - events := make(chan Events) - go func() { - c := Events{ - &CounterEvent{ - metricName: "counter_test", - value: 1, - labels: firstLabelSet, - }, - &CounterEvent{ - metricName: "counter_test", - value: 1, - labels: secondLabelSet, - }, - &GaugeEvent{ - metricName: "gauge_test", - value: 1, - labels: firstLabelSet, - }, - &GaugeEvent{ - metricName: "gauge_test", - value: 1, - labels: secondLabelSet, - }, - &TimerEvent{ - metricName: "histogram.test", - value: 1, - labels: firstLabelSet, - }, - &TimerEvent{ - metricName: "histogram.test", - value: 1, - labels: secondLabelSet, - }, - &TimerEvent{ - metricName: "summary_test", - value: 1, - labels: firstLabelSet, - }, - &TimerEvent{ - metricName: "summary_test", - value: 1, - labels: secondLabelSet, - }, - } - events <- c - close(events) - }() - - config := ` -mappings: -- match: histogram.test - timer_type: histogram - name: "histogram_test" -` - testMapper := &mapper.MetricMapper{} - err := testMapper.InitFromYAMLString(config, 0) - if err != nil { - t.Fatalf("Config load error: %s %s", config, err) - } - - ex := NewExporter(testMapper, log.NewNopLogger()) - ex.Listen(events) - - metrics, err := prometheus.DefaultGatherer.Gather() - if err != nil { - t.Fatalf("Cannot gather from DefaultGatherer: %v", err) - } - - for _, metricName := range metricNames { - firstMetric := getFloat64(metrics, metricName, firstLabelSet) - secondMetric := getFloat64(metrics, metricName, secondLabelSet) - - if firstMetric == nil { - t.Fatalf("Could not find time series with first label set for metric: %s", metricName) - } - if secondMetric == nil { - t.Fatalf("Could not find time series with second label set for metric: %s", metricName) - } - } -} - -// TestLabelParsing verifies that labels getting parsed out of metric -// names are being properly created. -func TestLabelParsing(t *testing.T) { - codes := [2]string{"200", "300"} - - events := make(chan Events) - go func() { - c := Events{ - &CounterEvent{ - metricName: "counter.test.200", - value: 1, - labels: make(map[string]string), - }, - &CounterEvent{ - metricName: "counter.test.300", - value: 1, - labels: make(map[string]string), - }, - } - events <- c - close(events) - }() - - config := ` -mappings: -- match: counter.test.* - name: "counter_test" - labels: - code: $1 -` - - testMapper := &mapper.MetricMapper{} - err := testMapper.InitFromYAMLString(config, 0) - if err != nil { - t.Fatalf("Config load error: %s %s", config, err) - } - - ex := NewExporter(testMapper, log.NewNopLogger()) - ex.Listen(events) - - metrics, err := prometheus.DefaultGatherer.Gather() - if err != nil { - t.Fatalf("Cannot gather from DefaultGatherer: %v", err) - } - - labels := make(map[string]string) - - for _, code := range codes { - labels["code"] = code - if getFloat64(metrics, "counter_test", labels) == nil { - t.Fatalf("Could not find metrics for counter_test code %s", code) - } - } -} - -// TestConflictingMetrics validates that the exporter will not register metrics -// of different types that have overlapping names. -func TestConflictingMetrics(t *testing.T) { - scenarios := []struct { - name string - expected []float64 - in Events - }{ - { - name: "counter vs gauge", - expected: []float64{1}, - in: Events{ - &CounterEvent{ - metricName: "cvg_test", - value: 1, - }, - &GaugeEvent{ - metricName: "cvg_test", - value: 2, - }, - }, - }, - { - name: "counter vs gauge with different labels", - expected: []float64{1, 2}, - in: Events{ - &CounterEvent{ - metricName: "cvgl_test", - value: 1, - labels: map[string]string{"tag": "1"}, - }, - &CounterEvent{ - metricName: "cvgl_test", - value: 2, - labels: map[string]string{"tag": "2"}, - }, - &GaugeEvent{ - metricName: "cvgl_test", - value: 3, - labels: map[string]string{"tag": "1"}, - }, - }, - }, - { - name: "counter vs gauge with same labels", - expected: []float64{3}, - in: Events{ - &CounterEvent{ - metricName: "cvgsl_test", - value: 1, - labels: map[string]string{"tag": "1"}, - }, - &CounterEvent{ - metricName: "cvgsl_test", - value: 2, - labels: map[string]string{"tag": "1"}, - }, - &GaugeEvent{ - metricName: "cvgsl_test", - value: 3, - labels: map[string]string{"tag": "1"}, - }, - }, - }, - { - name: "gauge vs counter", - expected: []float64{2}, - in: Events{ - &GaugeEvent{ - metricName: "gvc_test", - value: 2, - }, - &CounterEvent{ - metricName: "gvc_test", - value: 1, - }, - }, - }, - { - name: "counter vs histogram", - expected: []float64{1}, - in: Events{ - &CounterEvent{ - metricName: "histogram_test1", - value: 1, - }, - &TimerEvent{ - metricName: "histogram.test1", - value: 2, - }, - }, - }, - { - name: "counter vs histogram sum", - expected: []float64{1}, - in: Events{ - &CounterEvent{ - metricName: "histogram_test1_sum", - value: 1, - }, - &TimerEvent{ - metricName: "histogram.test1", - value: 2, - }, - }, - }, - { - name: "counter vs histogram count", - expected: []float64{1}, - in: Events{ - &CounterEvent{ - metricName: "histogram_test2_count", - value: 1, - }, - &TimerEvent{ - metricName: "histogram.test2", - value: 2, - }, - }, - }, - { - name: "counter vs histogram bucket", - expected: []float64{1}, - in: Events{ - &CounterEvent{ - metricName: "histogram_test3_bucket", - value: 1, - }, - &TimerEvent{ - metricName: "histogram.test3", - value: 2, - }, - }, - }, - { - name: "counter vs summary quantile", - expected: []float64{1}, - in: Events{ - &CounterEvent{ - metricName: "cvsq_test", - value: 1, - }, - &TimerEvent{ - metricName: "cvsq_test", - value: 2, - }, - }, - }, - { - name: "counter vs summary count", - expected: []float64{1}, - in: Events{ - &CounterEvent{ - metricName: "cvsc_count", - value: 1, - }, - &TimerEvent{ - metricName: "cvsc", - value: 2, - }, - }, - }, - { - name: "counter vs summary sum", - expected: []float64{1}, - in: Events{ - &CounterEvent{ - metricName: "cvss_sum", - value: 1, - }, - &TimerEvent{ - metricName: "cvss", - value: 2, - }, - }, - }, - } - - config := ` -mappings: -- match: histogram.* - timer_type: histogram - name: "histogram_${1}" -` - for _, s := range scenarios { - t.Run(s.name, func(t *testing.T) { - testMapper := &mapper.MetricMapper{} - err := testMapper.InitFromYAMLString(config, 0) - if err != nil { - t.Fatalf("Config load error: %s %s", config, err) - } - - events := make(chan Events) - go func() { - events <- s.in - close(events) - }() - ex := NewExporter(testMapper, log.NewNopLogger()) - ex.Listen(events) - - metrics, err := prometheus.DefaultGatherer.Gather() - if err != nil { - t.Fatalf("Cannot gather from DefaultGatherer: %v", err) - } - - for i, e := range s.expected { - mn := s.in[i].MetricName() - m := getFloat64(metrics, mn, s.in[i].Labels()) - - if m == nil { - t.Fatalf("Could not find time series with metric name '%v'", mn) - } - - if *m != e { - t.Fatalf("Expected to get %v, but got %v instead", e, *m) - } - } - }) - } -} - -// TestEmptyStringMetric validates when a metric name ends up -// being the empty string after applying the match replacements -// tha we don't panic the Exporter Listener. -func TestEmptyStringMetric(t *testing.T) { - events := make(chan Events) - go func() { - c := Events{ - &CounterEvent{ - metricName: "foo_bar", - value: 1, - }, - } - events <- c - close(events) - }() - - config := ` -mappings: -- match: .*_bar - match_type: regex - name: "${1}" -` - testMapper := &mapper.MetricMapper{} - err := testMapper.InitFromYAMLString(config, 0) - if err != nil { - t.Fatalf("Config load error: %s %s", config, err) - } - - errorCounter := errorEventStats.WithLabelValues("empty_metric_name") - prev := getTelemetryCounterValue(errorCounter) - - ex := NewExporter(testMapper, log.NewNopLogger()) - ex.Listen(events) - - updated := getTelemetryCounterValue(errorCounter) - if updated-prev != 1 { - t.Fatal("Empty metric name error event not counted") - } -} - -// TestInvalidUtf8InDatadogTagValue validates robustness of exporter listener -// against datadog tags with invalid tag values. -// It sends the same tags first with a valid value, then with an invalid one. -// The exporter should not panic, but drop the invalid event -func TestInvalidUtf8InDatadogTagValue(t *testing.T) { - defer func() { - if e := recover(); e != nil { - err := e.(error) - t.Fatalf("Exporter listener should not panic on bad utf8: %q", err.Error()) - } - }() - - events := make(chan Events) - ueh := &unbufferedEventHandler{c: events} - - go func() { - for _, l := range []statsDPacketHandler{&StatsDUDPListener{nil, nil, log.NewNopLogger()}, &mockStatsDTCPListener{StatsDTCPListener{nil, nil, log.NewNopLogger()}, log.NewNopLogger()}} { - l.SetEventHandler(ueh) - l.handlePacket([]byte("bar:200|c|#tag:value\nbar:200|c|#tag:\xc3\x28invalid")) - } - close(events) - }() - - testMapper := mapper.MetricMapper{} - testMapper.InitCache(0) - - ex := NewExporter(&testMapper, log.NewNopLogger()) - ex.Listen(events) -} - -// In the case of someone starting the statsd exporter with no mapping file specified -// which is valid, we want to make sure that the default quantile metrics are generated -// as well as the sum/count metrics -func TestSummaryWithQuantilesEmptyMapping(t *testing.T) { - // Start exporter with a synchronous channel - events := make(chan Events) - go func() { - testMapper := mapper.MetricMapper{} - testMapper.InitCache(0) - - ex := NewExporter(&testMapper, log.NewNopLogger()) - ex.Listen(events) - }() - - name := "default_foo" - c := Events{ - &TimerEvent{ - metricName: name, - value: 300, - }, - } - events <- c - events <- Events{} - close(events) - - metrics, err := prometheus.DefaultGatherer.Gather() - if err != nil { - t.Fatal("Gather should not fail: ", err) - } - - var metricFamily *dto.MetricFamily - for _, m := range metrics { - if *m.Name == name { - metricFamily = m - break - } - } - - if metricFamily == nil { - t.Fatal("Metric could not be found") - } - - quantiles := metricFamily.Metric[0].Summary.Quantile - if len(quantiles) == 0 { - t.Fatal("Summary has no quantiles available") - } -} - -func TestHistogramUnits(t *testing.T) { - // Start exporter with a synchronous channel - events := make(chan Events) - go func() { - testMapper := mapper.MetricMapper{} - testMapper.InitCache(0) - ex := NewExporter(&testMapper, log.NewNopLogger()) - ex.mapper.Defaults.TimerType = mapper.TimerTypeHistogram - ex.Listen(events) - }() - - // Synchronously send a statsd event to wait for handleEvent execution. - // Then close events channel to stop a listener. - name := "foo" - c := Events{ - &TimerEvent{ - metricName: name, - value: 300, - }, - } - events <- c - events <- Events{} - close(events) - - // Check histogram value - metrics, err := prometheus.DefaultGatherer.Gather() - if err != nil { - t.Fatalf("Cannot gather from DefaultGatherer: %v", err) - } - value := getFloat64(metrics, name, prometheus.Labels{}) - if value == nil { - t.Fatal("Histogram value should not be nil") - } - if *value == 300 { - t.Fatalf("Histogram observations not scaled into Seconds") - } else if *value != .300 { - t.Fatalf("Received unexpected value for histogram observation %f != .300", *value) - } -} -func TestCounterIncrement(t *testing.T) { - // Start exporter with a synchronous channel - events := make(chan Events) - go func() { - testMapper := mapper.MetricMapper{} - testMapper.InitCache(0) - ex := NewExporter(&testMapper, log.NewNopLogger()) - ex.Listen(events) - }() - - // Synchronously send a statsd event to wait for handleEvent execution. - // Then close events channel to stop a listener. - name := "foo_counter" - labels := map[string]string{ - "foo": "bar", - } - c := Events{ - &CounterEvent{ - metricName: name, - value: 1, - labels: labels, - }, - &CounterEvent{ - metricName: name, - value: 1, - labels: labels, - }, - } - events <- c - // Push empty event so that we block until the first event is consumed. - events <- Events{} - close(events) - - // Check histogram value - metrics, err := prometheus.DefaultGatherer.Gather() - if err != nil { - t.Fatalf("Cannot gather from DefaultGatherer: %v", err) - } - value := getFloat64(metrics, name, labels) - if value == nil { - t.Fatal("Counter value should not be nil") - } - if *value != 2 { - t.Fatalf("Counter wasn't incremented properly") - } -} - -type statsDPacketHandler interface { - handlePacket(packet []byte) - SetEventHandler(eh eventHandler) -} - -type mockStatsDTCPListener struct { - StatsDTCPListener - log.Logger -} - -func (ml *mockStatsDTCPListener) handlePacket(packet []byte) { - // Forcing IPv4 because the TravisCI build environment does not have IPv6 - // addresses. - lc, err := net.ListenTCP("tcp4", nil) - if err != nil { - panic(fmt.Sprintf("mockStatsDTCPListener: listen failed: %v", err)) - } - - defer lc.Close() - - go func() { - cc, err := net.DialTCP("tcp", nil, lc.Addr().(*net.TCPAddr)) - if err != nil { - panic(fmt.Sprintf("mockStatsDTCPListener: dial failed: %v", err)) - } - - defer cc.Close() - - n, err := cc.Write(packet) - if err != nil || n != len(packet) { - panic(fmt.Sprintf("mockStatsDTCPListener: write failed: %v,%d", err, n)) - } - }() - - sc, err := lc.AcceptTCP() - if err != nil { - panic(fmt.Sprintf("mockStatsDTCPListener: accept failed: %v", err)) - } - ml.handleConn(sc) -} - -// TestTtlExpiration validates expiration of time series. -// foobar metric without mapping should expire with default ttl of 1s -// bazqux metric should expire with ttl of 2s -func TestTtlExpiration(t *testing.T) { - // Mock a time.NewTicker - tickerCh := make(chan time.Time) - clock.ClockInstance = &clock.Clock{ - TickerCh: tickerCh, - } - - config := ` -defaults: - ttl: 1s -mappings: -- match: bazqux.* - name: bazqux - ttl: 2s -` - // Create mapper from config and start an Exporter with a synchronous channel - testMapper := &mapper.MetricMapper{} - err := testMapper.InitFromYAMLString(config, 0) - if err != nil { - t.Fatalf("Config load error: %s %s", config, err) - } - events := make(chan Events) - defer close(events) - go func() { - ex := NewExporter(testMapper, log.NewNopLogger()) - ex.Listen(events) - }() - - ev := Events{ - // event with default ttl = 1s - &GaugeEvent{ - metricName: "foobar", - value: 200, - }, - // event with ttl = 2s from a mapping - &TimerEvent{ - metricName: "bazqux.main", - value: 42000, - }, - } - - var metrics []*dto.MetricFamily - var foobarValue *float64 - var bazquxValue *float64 - - // Step 1. Send events with statsd metrics. - // Send empty Events to wait for events are handled. - // saveLabelValues will use fake instant as a lastRegisteredAt time. - clock.ClockInstance.Instant = time.Unix(0, 0) - events <- ev - events <- Events{} - - // Check values - metrics, err = prometheus.DefaultGatherer.Gather() - if err != nil { - t.Fatal("Gather should not fail") - } - foobarValue = getFloat64(metrics, "foobar", prometheus.Labels{}) - bazquxValue = getFloat64(metrics, "bazqux", prometheus.Labels{}) - if foobarValue == nil || bazquxValue == nil { - t.Fatalf("Gauge `foobar` and Summary `bazqux` should be gathered") - } - if *foobarValue != 200 { - t.Fatalf("Gauge `foobar` observation %f is not expected. Should be 200", *foobarValue) - } - if *bazquxValue != 42 { - t.Fatalf("Summary `bazqux` observation %f is not expected. Should be 42", *bazquxValue) - } - - // Step 2. Increase Instant to emulate metrics expiration after 1s - clock.ClockInstance.Instant = time.Unix(1, 10) - clock.ClockInstance.TickerCh <- time.Unix(0, 0) - events <- Events{} - - // Check values - metrics, err = prometheus.DefaultGatherer.Gather() - if err != nil { - t.Fatal("Gather should not fail") - } - foobarValue = getFloat64(metrics, "foobar", prometheus.Labels{}) - bazquxValue = getFloat64(metrics, "bazqux", prometheus.Labels{}) - if foobarValue != nil { - t.Fatalf("Gauge `foobar` should be expired") - } - if bazquxValue == nil { - t.Fatalf("Summary `bazqux` should be gathered") - } - if *bazquxValue != 42 { - t.Fatalf("Summary `bazqux` observation %f is not expected. Should be 42", *bazquxValue) - } - - // Step 3. Increase Instant to emulate metrics expiration after 2s - clock.ClockInstance.Instant = time.Unix(2, 200) - clock.ClockInstance.TickerCh <- time.Unix(0, 0) - events <- Events{} - - // Check values - metrics, err = prometheus.DefaultGatherer.Gather() - if err != nil { - t.Fatal("Gather should not fail") - } - foobarValue = getFloat64(metrics, "foobar", prometheus.Labels{}) - bazquxValue = getFloat64(metrics, "bazqux", prometheus.Labels{}) - if bazquxValue != nil { - t.Fatalf("Summary `bazqux` should be expired") - } - if foobarValue != nil { - t.Fatalf("Gauge `foobar` should not be gathered after expiration") - } -} - -func TestHashLabelNames(t *testing.T) { - r := newRegistry(nil) - // Validate value hash changes and name has doesn't when just the value changes. - hash1, _ := r.hashLabels(map[string]string{ - "label": "value1", - }) - hash2, _ := r.hashLabels(map[string]string{ - "label": "value2", - }) - if hash1.names != hash2.names { - t.Fatal("Hash of label names should match, but doesn't") - } - if hash1.values == hash2.values { - t.Fatal("Hash of label names shouldn't match, but do") - } - - // Validate value and name hashes change when the name changes. - hash1, _ = r.hashLabels(map[string]string{ - "label1": "value", - }) - hash2, _ = r.hashLabels(map[string]string{ - "label2": "value", - }) - if hash1.names == hash2.names { - t.Fatal("Hash of label names shouldn't match, but do") - } - if hash1.values == hash2.values { - t.Fatal("Hash of label names shouldn't match, but do") - } -} - -// getFloat64 search for metric by name in array of MetricFamily and then search a value by labels. -// Method returns a value or nil if metric is not found. -func getFloat64(metrics []*dto.MetricFamily, name string, labels prometheus.Labels) *float64 { - var metricFamily *dto.MetricFamily - for _, m := range metrics { - if *m.Name == name { - metricFamily = m - break - } - } - if metricFamily == nil { - return nil - } - - var metric *dto.Metric - labelStr := fmt.Sprintf("%v", labels) - for _, m := range metricFamily.Metric { - l := labelPairsAsLabels(m.GetLabel()) - ls := fmt.Sprintf("%v", l) - if labelStr == ls { - metric = m - break - } - } - if metric == nil { - return nil - } - - var value float64 - if metric.Gauge != nil { - value = metric.Gauge.GetValue() - return &value - } - if metric.Counter != nil { - value = metric.Counter.GetValue() - return &value - } - if metric.Histogram != nil { - value = metric.Histogram.GetSampleSum() - return &value - } - if metric.Summary != nil { - value = metric.Summary.GetSampleSum() - return &value - } - if metric.Untyped != nil { - value = metric.Untyped.GetValue() - return &value - } - panic(fmt.Errorf("collected a non-gauge/counter/histogram/summary/untyped metric: %s", metric)) -} - -func labelPairsAsLabels(pairs []*dto.LabelPair) (labels prometheus.Labels) { - labels = prometheus.Labels{} - for _, pair := range pairs { - if pair.Name == nil { - continue - } - value := "" - if pair.Value != nil { - value = *pair.Value - } - labels[*pair.Name] = value - } - return -} - -func getTelemetryCounterValue(counter prometheus.Counter) float64 { - var metric dto.Metric - err := counter.Write(&metric) - if err != nil { - return 0.0 - } - return metric.Counter.GetValue() -} - -func BenchmarkParseDogStatsDTags(b *testing.B) { - scenarios := map[string]string{ - "1 tag w/hash": "#test:tag", - "1 tag w/o hash": "test:tag", - "2 tags, mixed hashes": "tag1:test,#tag2:test", - "3 long tags": "tag1:reallylongtagthisisreallylong,tag2:anotherreallylongtag,tag3:thisisyetanotherextraordinarilylongtag", - "a-z tags": "a:0,b:1,c:2,d:3,e:4,f:5,g:6,h:7,i:8,j:9,k:0,l:1,m:2,n:3,o:4,p:5,q:6,r:7,s:8,t:9,u:0,v:1,w:2,x:3,y:4,z:5", - } - - for name, tags := range scenarios { - b.Run(name, func(b *testing.B) { - for n := 0; n < b.N; n++ { - labels := map[string]string{} - parseDogStatsDTags(tags, labels, log.NewNopLogger()) - } - }) - } -} - -func BenchmarkHashNameAndLabels(b *testing.B) { - scenarios := []struct { - name string - metric string - labels map[string]string - }{ - { - name: "no labels", - labels: map[string]string{}, - }, { - name: "one label", - labels: map[string]string{ - "label": "value", - }, - }, { - name: "many labels", - labels: map[string]string{ - "label0": "value", - "label1": "value", - "label2": "value", - "label3": "value", - "label4": "value", - "label5": "value", - "label6": "value", - "label7": "value", - "label8": "value", - "label9": "value", - }, - }, - } - - r := newRegistry(nil) - for _, s := range scenarios { - b.Run(s.name, func(b *testing.B) { - for n := 0; n < b.N; n++ { - r.hashLabels(s.labels) - } - }) - } -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "fmt" + "net" + "testing" + "time" + + "github.com/go-kit/kit/log" + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/statsd_exporter/pkg/clock" + "github.com/prometheus/statsd_exporter/pkg/event" + "github.com/prometheus/statsd_exporter/pkg/exporter" + "github.com/prometheus/statsd_exporter/pkg/line" + "github.com/prometheus/statsd_exporter/pkg/listener" + "github.com/prometheus/statsd_exporter/pkg/mapper" + "github.com/prometheus/statsd_exporter/pkg/registry" +) + +// TestNegativeCounter validates when we send a negative +// number to a counter that we no longer panic the Exporter Listener. +func TestNegativeCounter(t *testing.T) { + defer func() { + if e := recover(); e != nil { + err := e.(error) + if err.Error() == "counter cannot decrease in value" { + t.Fatalf("Counter was negative and causes a panic.") + } else { + t.Fatalf("Unknown panic and error: %q", err.Error()) + } + } + }() + + events := make(chan event.Events) + go func() { + c := event.Events{ + &event.CounterEvent{ + CMetricName: "foo", + CValue: -1, + }, + } + events <- c + close(events) + }() + + errorCounter := errorEventStats.WithLabelValues("illegal_negative_counter") + prev := getTelemetryCounterValue(errorCounter) + + testMapper := mapper.MetricMapper{} + testMapper.InitCache(0) + + ex := exporter.NewExporter(&testMapper, log.NewNopLogger()) + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + + updated := getTelemetryCounterValue(errorCounter) + if updated-prev != 1 { + t.Fatal("Illegal negative counter error not counted") + } +} + +// TestInconsistentLabelSets validates that the exporter will register +// and record metrics with the same metric name but inconsistent label +// sets e.g foo{a="1"} and foo{b="1"} +func TestInconsistentLabelSets(t *testing.T) { + firstLabelSet := make(map[string]string) + secondLabelSet := make(map[string]string) + metricNames := [4]string{"counter_test", "gauge_test", "histogram_test", "summary_test"} + + firstLabelSet["foo"] = "1" + secondLabelSet["foo"] = "1" + secondLabelSet["bar"] = "2" + + events := make(chan event.Events) + go func() { + c := event.Events{ + &event.CounterEvent{ + CMetricName: "counter_test", + CValue: 1, + CLabels: firstLabelSet, + }, + &event.CounterEvent{ + CMetricName: "counter_test", + CValue: 1, + CLabels: secondLabelSet, + }, + &event.GaugeEvent{ + GMetricName: "gauge_test", + GValue: 1, + GLabels: firstLabelSet, + }, + &event.GaugeEvent{ + GMetricName: "gauge_test", + GValue: 1, + GLabels: secondLabelSet, + }, + &event.TimerEvent{ + TMetricName: "histogram.test", + TValue: 1, + TLabels: firstLabelSet, + }, + &event.TimerEvent{ + TMetricName: "histogram.test", + TValue: 1, + TLabels: secondLabelSet, + }, + &event.TimerEvent{ + TMetricName: "summary_test", + TValue: 1, + TLabels: firstLabelSet, + }, + &event.TimerEvent{ + TMetricName: "summary_test", + TValue: 1, + TLabels: secondLabelSet, + }, + } + events <- c + close(events) + }() + + config := ` +mappings: +- match: histogram.test + timer_type: histogram + name: "histogram_test" +` + testMapper := &mapper.MetricMapper{} + err := testMapper.InitFromYAMLString(config, 0) + if err != nil { + t.Fatalf("Config load error: %s %s", config, err) + } + + ex := exporter.NewExporter(testMapper, log.NewNopLogger()) + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + + metrics, err := prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatalf("Cannot gather from DefaultGatherer: %v", err) + } + + for _, metricName := range metricNames { + firstMetric := getFloat64(metrics, metricName, firstLabelSet) + secondMetric := getFloat64(metrics, metricName, secondLabelSet) + + if firstMetric == nil { + t.Fatalf("Could not find time series with first label set for metric: %s", metricName) + } + if secondMetric == nil { + t.Fatalf("Could not find time series with second label set for metric: %s", metricName) + } + } +} + +// TestLabelParsing verifies that labels getting parsed out of metric +// names are being properly created. +func TestLabelParsing(t *testing.T) { + codes := [2]string{"200", "300"} + + events := make(chan event.Events) + go func() { + c := event.Events{ + &event.CounterEvent{ + CMetricName: "counter.test.200", + CValue: 1, + CLabels: make(map[string]string), + }, + &event.CounterEvent{ + CMetricName: "counter.test.300", + CValue: 1, + CLabels: make(map[string]string), + }, + } + events <- c + close(events) + }() + + config := ` +mappings: +- match: counter.test.* + name: "counter_test" + labels: + code: $1 +` + + testMapper := &mapper.MetricMapper{} + err := testMapper.InitFromYAMLString(config, 0) + if err != nil { + t.Fatalf("Config load error: %s %s", config, err) + } + + ex := exporter.NewExporter(testMapper, log.NewNopLogger()) + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + + metrics, err := prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatalf("Cannot gather from DefaultGatherer: %v", err) + } + + labels := make(map[string]string) + + for _, code := range codes { + labels["code"] = code + if getFloat64(metrics, "counter_test", labels) == nil { + t.Fatalf("Could not find metrics for counter_test code %s", code) + } + } +} + +// TestConflictingMetrics validates that the exporter will not register metrics +// of different types that have overlapping names. +func TestConflictingMetrics(t *testing.T) { + scenarios := []struct { + name string + expected []float64 + in event.Events + }{ + { + name: "counter vs gauge", + expected: []float64{1}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "cvg_test", + CValue: 1, + }, + &event.GaugeEvent{ + GMetricName: "cvg_test", + GValue: 2, + }, + }, + }, + { + name: "counter vs gauge with different labels", + expected: []float64{1, 2}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "cvgl_test", + CValue: 1, + CLabels: map[string]string{"tag": "1"}, + }, + &event.CounterEvent{ + CMetricName: "cvgl_test", + CValue: 2, + CLabels: map[string]string{"tag": "2"}, + }, + &event.GaugeEvent{ + GMetricName: "cvgl_test", + GValue: 3, + GLabels: map[string]string{"tag": "1"}, + }, + }, + }, + { + name: "counter vs gauge with same labels", + expected: []float64{3}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "cvgsl_test", + CValue: 1, + CLabels: map[string]string{"tag": "1"}, + }, + &event.CounterEvent{ + CMetricName: "cvgsl_test", + CValue: 2, + CLabels: map[string]string{"tag": "1"}, + }, + &event.GaugeEvent{ + GMetricName: "cvgsl_test", + GValue: 3, + GLabels: map[string]string{"tag": "1"}, + }, + }, + }, + { + name: "gauge vs counter", + expected: []float64{2}, + in: event.Events{ + &event.GaugeEvent{ + GMetricName: "gvc_test", + GValue: 2, + }, + &event.CounterEvent{ + CMetricName: "gvc_test", + CValue: 1, + }, + }, + }, + { + name: "counter vs histogram", + expected: []float64{1}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "histogram_test1", + CValue: 1, + }, + &event.TimerEvent{ + TMetricName: "histogram.test1", + TValue: 2, + }, + }, + }, + { + name: "counter vs histogram sum", + expected: []float64{1}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "histogram_test1_sum", + CValue: 1, + }, + &event.TimerEvent{ + TMetricName: "histogram.test1", + TValue: 2, + }, + }, + }, + { + name: "counter vs histogram count", + expected: []float64{1}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "histogram_test2_count", + CValue: 1, + }, + &event.TimerEvent{ + TMetricName: "histogram.test2", + TValue: 2, + }, + }, + }, + { + name: "counter vs histogram bucket", + expected: []float64{1}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "histogram_test3_bucket", + CValue: 1, + }, + &event.TimerEvent{ + TMetricName: "histogram.test3", + TValue: 2, + }, + }, + }, + { + name: "counter vs summary quantile", + expected: []float64{1}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "cvsq_test", + CValue: 1, + }, + &event.TimerEvent{ + TMetricName: "cvsq_test", + TValue: 2, + }, + }, + }, + { + name: "counter vs summary count", + expected: []float64{1}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "cvsc_count", + CValue: 1, + }, + &event.TimerEvent{ + TMetricName: "cvsc", + TValue: 2, + }, + }, + }, + { + name: "counter vs summary sum", + expected: []float64{1}, + in: event.Events{ + &event.CounterEvent{ + CMetricName: "cvss_sum", + CValue: 1, + }, + &event.TimerEvent{ + TMetricName: "cvss", + TValue: 2, + }, + }, + }, + } + + config := ` +mappings: +- match: histogram.* + timer_type: histogram + name: "histogram_${1}" +` + for _, s := range scenarios { + t.Run(s.name, func(t *testing.T) { + testMapper := &mapper.MetricMapper{} + err := testMapper.InitFromYAMLString(config, 0) + if err != nil { + t.Fatalf("Config load error: %s %s", config, err) + } + + events := make(chan event.Events) + go func() { + events <- s.in + close(events) + }() + ex := exporter.NewExporter(testMapper, log.NewNopLogger()) + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + + metrics, err := prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatalf("Cannot gather from DefaultGatherer: %v", err) + } + + for i, e := range s.expected { + mn := s.in[i].MetricName() + m := getFloat64(metrics, mn, s.in[i].Labels()) + + if m == nil { + t.Fatalf("Could not find time series with metric name '%v'", mn) + } + + if *m != e { + t.Fatalf("Expected to get %v, but got %v instead", e, *m) + } + } + }) + } +} + +// TestEmptyStringMetric validates when a metric name ends up +// being the empty string after applying the match replacements +// tha we don't panic the Exporter Listener. +func TestEmptyStringMetric(t *testing.T) { + events := make(chan event.Events) + go func() { + c := event.Events{ + &event.CounterEvent{ + CMetricName: "foo_bar", + CValue: 1, + }, + } + events <- c + close(events) + }() + + config := ` +mappings: +- match: .*_bar + match_type: regex + name: "${1}" +` + testMapper := &mapper.MetricMapper{} + err := testMapper.InitFromYAMLString(config, 0) + if err != nil { + t.Fatalf("Config load error: %s %s", config, err) + } + + errorCounter := errorEventStats.WithLabelValues("empty_metric_name") + prev := getTelemetryCounterValue(errorCounter) + + ex := exporter.NewExporter(testMapper, log.NewNopLogger()) + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + + updated := getTelemetryCounterValue(errorCounter) + if updated-prev != 1 { + t.Fatal("Empty metric name error event not counted") + } +} + +// TestInvalidUtf8InDatadogTagValue validates robustness of exporter listener +// against datadog tags with invalid tag values. +// It sends the same tags first with a valid value, then with an invalid one. +// The exporter should not panic, but drop the invalid event +func TestInvalidUtf8InDatadogTagValue(t *testing.T) { + defer func() { + if e := recover(); e != nil { + err := e.(error) + t.Fatalf("Exporter listener should not panic on bad utf8: %q", err.Error()) + } + }() + + events := make(chan event.Events) + ueh := &event.UnbufferedEventHandler{C: events} + + go func() { + for _, l := range []statsDPacketHandler{&listener.StatsDUDPListener{nil, nil, log.NewNopLogger()}, &mockStatsDTCPListener{listener.StatsDTCPListener{nil, nil, log.NewNopLogger()}, log.NewNopLogger()}} { + l.SetEventHandler(ueh) + l.HandlePacket([]byte("bar:200|c|#tag:value\nbar:200|c|#tag:\xc3\x28invalid"), udpPackets, linesReceived, eventsFlushed, *sampleErrors, samplesReceived, tagErrors, tagsReceived) + } + close(events) + }() + + testMapper := mapper.MetricMapper{} + testMapper.InitCache(0) + + ex := exporter.NewExporter(&testMapper, log.NewNopLogger()) + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) +} + +// In the case of someone starting the statsd exporter with no mapping file specified +// which is valid, we want to make sure that the default quantile metrics are generated +// as well as the sum/count metrics +func TestSummaryWithQuantilesEmptyMapping(t *testing.T) { + // Start exporter with a synchronous channel + events := make(chan event.Events) + go func() { + testMapper := mapper.MetricMapper{} + testMapper.InitCache(0) + + ex := exporter.NewExporter(&testMapper, log.NewNopLogger()) + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + }() + + name := "default_foo" + c := event.Events{ + &event.TimerEvent{ + TMetricName: name, + TValue: 300, + }, + } + events <- c + events <- event.Events{} + close(events) + + metrics, err := prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatal("Gather should not fail: ", err) + } + + var metricFamily *dto.MetricFamily + for _, m := range metrics { + if *m.Name == name { + metricFamily = m + break + } + } + + if metricFamily == nil { + t.Fatal("Metric could not be found") + } + + quantiles := metricFamily.Metric[0].Summary.Quantile + if len(quantiles) == 0 { + t.Fatal("Summary has no quantiles available") + } +} + +func TestHistogramUnits(t *testing.T) { + // Start exporter with a synchronous channel + events := make(chan event.Events) + go func() { + testMapper := mapper.MetricMapper{} + testMapper.InitCache(0) + ex := exporter.NewExporter(&testMapper, log.NewNopLogger()) + ex.Mapper.Defaults.TimerType = mapper.TimerTypeHistogram + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + }() + + // Synchronously send a statsd event to wait for handleEvent execution. + // Then close events channel to stop a listener. + name := "foo" + c := event.Events{ + &event.TimerEvent{ + TMetricName: name, + TValue: 300, + }, + } + events <- c + events <- event.Events{} + close(events) + + // Check histogram value + metrics, err := prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatalf("Cannot gather from DefaultGatherer: %v", err) + } + value := getFloat64(metrics, name, prometheus.Labels{}) + if value == nil { + t.Fatal("Histogram value should not be nil") + } + if *value == 300 { + t.Fatalf("Histogram observations not scaled into Seconds") + } else if *value != .300 { + t.Fatalf("Received unexpected value for histogram observation %f != .300", *value) + } +} +func TestCounterIncrement(t *testing.T) { + // Start exporter with a synchronous channel + events := make(chan event.Events) + go func() { + testMapper := mapper.MetricMapper{} + testMapper.InitCache(0) + ex := exporter.NewExporter(&testMapper, log.NewNopLogger()) + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + }() + + // Synchronously send a statsd event to wait for handleEvent execution. + // Then close events channel to stop a listener. + name := "foo_counter" + labels := map[string]string{ + "foo": "bar", + } + c := event.Events{ + &event.CounterEvent{ + CMetricName: name, + CValue: 1, + CLabels: labels, + }, + &event.CounterEvent{ + CMetricName: name, + CValue: 1, + CLabels: labels, + }, + } + events <- c + // Push empty event so that we block until the first event is consumed. + events <- event.Events{} + close(events) + + // Check histogram value + metrics, err := prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatalf("Cannot gather from DefaultGatherer: %v", err) + } + value := getFloat64(metrics, name, labels) + if value == nil { + t.Fatal("Counter value should not be nil") + } + if *value != 2 { + t.Fatalf("Counter wasn't incremented properly") + } +} + +type statsDPacketHandler interface { + HandlePacket(packet []byte, udpPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) + SetEventHandler(eh event.EventHandler) +} + +type mockStatsDTCPListener struct { + listener.StatsDTCPListener + log.Logger +} + +func (ml *mockStatsDTCPListener) HandlePacket(packet []byte, udpPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + // Forcing IPv4 because the TravisCI build environment does not have IPv6 + // addresses. + lc, err := net.ListenTCP("tcp4", nil) + if err != nil { + panic(fmt.Sprintf("mockStatsDTCPListener: listen failed: %v", err)) + } + + defer lc.Close() + + go func() { + cc, err := net.DialTCP("tcp", nil, lc.Addr().(*net.TCPAddr)) + if err != nil { + panic(fmt.Sprintf("mockStatsDTCPListener: dial failed: %v", err)) + } + + defer cc.Close() + + n, err := cc.Write(packet) + if err != nil || n != len(packet) { + panic(fmt.Sprintf("mockStatsDTCPListener: write failed: %v,%d", err, n)) + } + }() + + sc, err := lc.AcceptTCP() + if err != nil { + panic(fmt.Sprintf("mockStatsDTCPListener: accept failed: %v", err)) + } + ml.HandleConn(sc, linesReceived, eventsFlushed, tcpConnections, tcpErrors, tcpLineTooLong, sampleErrors, samplesReceived, tagErrors, tagsReceived) +} + +// TestTtlExpiration validates expiration of time series. +// foobar metric without mapping should expire with default ttl of 1s +// bazqux metric should expire with ttl of 2s +func TestTtlExpiration(t *testing.T) { + // Mock a time.NewTicker + tickerCh := make(chan time.Time) + clock.ClockInstance = &clock.Clock{ + TickerCh: tickerCh, + } + + config := ` +defaults: + ttl: 1s +mappings: +- match: bazqux.* + name: bazqux + ttl: 2s +` + // Create mapper from config and start an Exporter with a synchronous channel + testMapper := &mapper.MetricMapper{} + err := testMapper.InitFromYAMLString(config, 0) + if err != nil { + t.Fatalf("Config load error: %s %s", config, err) + } + events := make(chan event.Events) + defer close(events) + go func() { + ex := exporter.NewExporter(testMapper, log.NewNopLogger()) + ex.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + }() + + ev := event.Events{ + // event with default ttl = 1s + &event.GaugeEvent{ + GMetricName: "foobar", + GValue: 200, + }, + // event with ttl = 2s from a mapping + &event.TimerEvent{ + TMetricName: "bazqux.main", + TValue: 42000, + }, + } + + var metrics []*dto.MetricFamily + var foobarValue *float64 + var bazquxValue *float64 + + // Step 1. Send events with statsd metrics. + // Send empty Events to wait for events are handled. + // saveLabelValues will use fake instant as a lastRegisteredAt time. + clock.ClockInstance.Instant = time.Unix(0, 0) + events <- ev + events <- event.Events{} + + // Check values + metrics, err = prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatal("Gather should not fail") + } + foobarValue = getFloat64(metrics, "foobar", prometheus.Labels{}) + bazquxValue = getFloat64(metrics, "bazqux", prometheus.Labels{}) + if foobarValue == nil || bazquxValue == nil { + t.Fatalf("Gauge `foobar` and Summary `bazqux` should be gathered") + } + if *foobarValue != 200 { + t.Fatalf("Gauge `foobar` observation %f is not expected. Should be 200", *foobarValue) + } + if *bazquxValue != 42 { + t.Fatalf("Summary `bazqux` observation %f is not expected. Should be 42", *bazquxValue) + } + + // Step 2. Increase Instant to emulate metrics expiration after 1s + clock.ClockInstance.Instant = time.Unix(1, 10) + clock.ClockInstance.TickerCh <- time.Unix(0, 0) + events <- event.Events{} + + // Check values + metrics, err = prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatal("Gather should not fail") + } + foobarValue = getFloat64(metrics, "foobar", prometheus.Labels{}) + bazquxValue = getFloat64(metrics, "bazqux", prometheus.Labels{}) + if foobarValue != nil { + t.Fatalf("Gauge `foobar` should be expired") + } + if bazquxValue == nil { + t.Fatalf("Summary `bazqux` should be gathered") + } + if *bazquxValue != 42 { + t.Fatalf("Summary `bazqux` observation %f is not expected. Should be 42", *bazquxValue) + } + + // Step 3. Increase Instant to emulate metrics expiration after 2s + clock.ClockInstance.Instant = time.Unix(2, 200) + clock.ClockInstance.TickerCh <- time.Unix(0, 0) + events <- event.Events{} + + // Check values + metrics, err = prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatal("Gather should not fail") + } + foobarValue = getFloat64(metrics, "foobar", prometheus.Labels{}) + bazquxValue = getFloat64(metrics, "bazqux", prometheus.Labels{}) + if bazquxValue != nil { + t.Fatalf("Summary `bazqux` should be expired") + } + if foobarValue != nil { + t.Fatalf("Gauge `foobar` should not be gathered after expiration") + } +} + +func TestHashLabelNames(t *testing.T) { + r := registry.NewRegistry(nil) + // Validate value hash changes and name has doesn't when just the value changes. + hash1, _ := r.HashLabels(map[string]string{ + "label": "value1", + }) + hash2, _ := r.HashLabels(map[string]string{ + "label": "value2", + }) + if hash1.Names != hash2.Names { + t.Fatal("Hash of label names should match, but doesn't") + } + if hash1.Values == hash2.Values { + t.Fatal("Hash of label names shouldn't match, but do") + } + + // Validate value and name hashes change when the name changes. + hash1, _ = r.HashLabels(map[string]string{ + "label1": "value", + }) + hash2, _ = r.HashLabels(map[string]string{ + "label2": "value", + }) + if hash1.Names == hash2.Names { + t.Fatal("Hash of label names shouldn't match, but do") + } + if hash1.Values == hash2.Values { + t.Fatal("Hash of label names shouldn't match, but do") + } +} + +// getFloat64 search for metric by name in array of MetricFamily and then search a value by labels. +// Method returns a value or nil if metric is not found. +func getFloat64(metrics []*dto.MetricFamily, name string, labels prometheus.Labels) *float64 { + var metricFamily *dto.MetricFamily + for _, m := range metrics { + if *m.Name == name { + metricFamily = m + break + } + } + if metricFamily == nil { + return nil + } + + var metric *dto.Metric + labelStr := fmt.Sprintf("%v", labels) + for _, m := range metricFamily.Metric { + l := labelPairsAsLabels(m.GetLabel()) + ls := fmt.Sprintf("%v", l) + if labelStr == ls { + metric = m + break + } + } + if metric == nil { + return nil + } + + var value float64 + if metric.Gauge != nil { + value = metric.Gauge.GetValue() + return &value + } + if metric.Counter != nil { + value = metric.Counter.GetValue() + return &value + } + if metric.Histogram != nil { + value = metric.Histogram.GetSampleSum() + return &value + } + if metric.Summary != nil { + value = metric.Summary.GetSampleSum() + return &value + } + if metric.Untyped != nil { + value = metric.Untyped.GetValue() + return &value + } + panic(fmt.Errorf("collected a non-gauge/counter/histogram/summary/untyped metric: %s", metric)) +} + +func labelPairsAsLabels(pairs []*dto.LabelPair) (labels prometheus.Labels) { + labels = prometheus.Labels{} + for _, pair := range pairs { + if pair.Name == nil { + continue + } + value := "" + if pair.Value != nil { + value = *pair.Value + } + labels[*pair.Name] = value + } + return +} + +func getTelemetryCounterValue(counter prometheus.Counter) float64 { + var metric dto.Metric + err := counter.Write(&metric) + if err != nil { + return 0.0 + } + return metric.Counter.GetValue() +} + +func BenchmarkParseDogStatsDTags(b *testing.B) { + scenarios := map[string]string{ + "1 tag w/hash": "#test:tag", + "1 tag w/o hash": "test:tag", + "2 tags, mixed hashes": "tag1:test,#tag2:test", + "3 long tags": "tag1:reallylongtagthisisreallylong,tag2:anotherreallylongtag,tag3:thisisyetanotherextraordinarilylongtag", + "a-z tags": "a:0,b:1,c:2,d:3,e:4,f:5,g:6,h:7,i:8,j:9,k:0,l:1,m:2,n:3,o:4,p:5,q:6,r:7,s:8,t:9,u:0,v:1,w:2,x:3,y:4,z:5", + } + + for name, tags := range scenarios { + b.Run(name, func(b *testing.B) { + for n := 0; n < b.N; n++ { + labels := map[string]string{} + line.ParseDogStatsDTags(tags, labels, tagErrors, log.NewNopLogger()) + } + }) + } +} + +func BenchmarkHashNameAndLabels(b *testing.B) { + scenarios := []struct { + name string + metric string + labels map[string]string + }{ + { + name: "no labels", + labels: map[string]string{}, + }, { + name: "one label", + labels: map[string]string{ + "label": "value", + }, + }, { + name: "many labels", + labels: map[string]string{ + "label0": "value", + "label1": "value", + "label2": "value", + "label3": "value", + "label4": "value", + "label5": "value", + "label6": "value", + "label7": "value", + "label8": "value", + "label9": "value", + }, + }, + } + + r := registry.NewRegistry(nil) + for _, s := range scenarios { + b.Run(s.name, func(b *testing.B) { + for n := 0; n < b.N; n++ { + r.HashLabels(s.labels) + } + }) + } +} diff --git a/go.mod b/go.mod index 6873c9f..1cd2402 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,15 @@ -module github.com/prometheus/statsd_exporter - -require ( - github.com/go-kit/kit v0.9.0 - github.com/hashicorp/golang-lru v0.5.1 - github.com/kr/pretty v0.1.0 // indirect - github.com/prometheus/client_golang v1.0.0 - github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 - github.com/prometheus/common v0.7.0 - gopkg.in/alecthomas/kingpin.v2 v2.2.6 - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect - gopkg.in/yaml.v2 v2.2.2 -) - -go 1.13 +module github.com/prometheus/statsd_exporter + +require ( + github.com/go-kit/kit v0.9.0 + github.com/hashicorp/golang-lru v0.5.1 + github.com/kr/pretty v0.1.0 // indirect + github.com/prometheus/client_golang v1.0.0 + github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 + github.com/prometheus/common v0.7.0 + gopkg.in/alecthomas/kingpin.v2 v2.2.6 + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect + gopkg.in/yaml.v2 v2.2.2 +) + +go 1.13 diff --git a/go.sum b/go.sum index 5799ea8..bd2f8b0 100644 --- a/go.sum +++ b/go.sum @@ -56,6 +56,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.5.0 h1:Ctq0iGpCmr3jeP77kbF2UxgvRwzWWz+4Bh9/vJTyg1A= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= diff --git a/main.go b/main.go index b36d3c4..67c8d82 100644 --- a/main.go +++ b/main.go @@ -1,302 +1,414 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "bufio" - "fmt" - "net" - "net/http" - _ "net/http/pprof" - "os" - "os/signal" - "strconv" - "syscall" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/log/level" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/prometheus/common/promlog" - "github.com/prometheus/common/promlog/flag" - "github.com/prometheus/common/version" - "gopkg.in/alecthomas/kingpin.v2" - - "github.com/prometheus/statsd_exporter/pkg/mapper" -) - -func init() { - prometheus.MustRegister(version.NewCollector("statsd_exporter")) -} - -func serveHTTP(listenAddress, metricsEndpoint string, logger log.Logger) { - http.Handle(metricsEndpoint, promhttp.Handler()) - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte(` - StatsD Exporter - -

StatsD Exporter

-

Metrics

- - `)) - }) - level.Error(logger).Log("msg", http.ListenAndServe(listenAddress, nil)) - os.Exit(1) -} - -func ipPortFromString(addr string) (*net.IPAddr, int, error) { - host, portStr, err := net.SplitHostPort(addr) - if err != nil { - return nil, 0, fmt.Errorf("bad StatsD listening address: %s", addr) - } - - if host == "" { - host = "0.0.0.0" - } - ip, err := net.ResolveIPAddr("ip", host) - if err != nil { - return nil, 0, fmt.Errorf("Unable to resolve %s: %s", host, err) - } - - port, err := strconv.Atoi(portStr) - if err != nil || port < 0 || port > 65535 { - return nil, 0, fmt.Errorf("Bad port %s: %s", portStr, err) - } - - return ip, port, nil -} - -func udpAddrFromString(addr string) (*net.UDPAddr, error) { - ip, port, err := ipPortFromString(addr) - if err != nil { - return nil, err - } - return &net.UDPAddr{ - IP: ip.IP, - Port: port, - Zone: ip.Zone, - }, nil -} - -func tcpAddrFromString(addr string) (*net.TCPAddr, error) { - ip, port, err := ipPortFromString(addr) - if err != nil { - return nil, err - } - return &net.TCPAddr{ - IP: ip.IP, - Port: port, - Zone: ip.Zone, - }, nil -} - -func configReloader(fileName string, mapper *mapper.MetricMapper, cacheSize int, logger log.Logger, option mapper.CacheOption) { - - signals := make(chan os.Signal, 1) - signal.Notify(signals, syscall.SIGHUP) - - for s := range signals { - if fileName == "" { - level.Warn(logger).Log("msg", "Received signal but no mapping config to reload", "signal", s) - continue - } - level.Info(logger).Log("msg", "Received signal, attempting reload", "signal", s) - err := mapper.InitFromFile(fileName, cacheSize, option) - if err != nil { - level.Info(logger).Log("msg", "Error reloading config", "error", err) - configLoads.WithLabelValues("failure").Inc() - } else { - level.Info(logger).Log("msg", "Config reloaded successfully") - configLoads.WithLabelValues("success").Inc() - } - } -} - -func dumpFSM(mapper *mapper.MetricMapper, dumpFilename string, logger log.Logger) error { - f, err := os.Create(dumpFilename) - if err != nil { - return err - } - level.Info(logger).Log("msg", "Start dumping FSM", "file_name", dumpFilename) - w := bufio.NewWriter(f) - mapper.FSM.DumpFSM(w) - w.Flush() - f.Close() - level.Info(logger).Log("msg", "Finish dumping FSM") - return nil -} - -func main() { - var ( - listenAddress = kingpin.Flag("web.listen-address", "The address on which to expose the web interface and generated Prometheus metrics.").Default(":9102").String() - metricsEndpoint = kingpin.Flag("web.telemetry-path", "Path under which to expose metrics.").Default("/metrics").String() - statsdListenUDP = kingpin.Flag("statsd.listen-udp", "The UDP address on which to receive statsd metric lines. \"\" disables it.").Default(":9125").String() - statsdListenTCP = kingpin.Flag("statsd.listen-tcp", "The TCP address on which to receive statsd metric lines. \"\" disables it.").Default(":9125").String() - statsdListenUnixgram = kingpin.Flag("statsd.listen-unixgram", "The Unixgram socket path to receive statsd metric lines in datagram. \"\" disables it.").Default("").String() - // not using Int here because flag diplays default in decimal, 0755 will show as 493 - statsdUnixSocketMode = kingpin.Flag("statsd.unixsocket-mode", "The permission mode of the unix socket.").Default("755").String() - mappingConfig = kingpin.Flag("statsd.mapping-config", "Metric mapping configuration file name.").String() - readBuffer = kingpin.Flag("statsd.read-buffer", "Size (in bytes) of the operating system's transmit read buffer associated with the UDP or Unixgram connection. Please make sure the kernel parameters net.core.rmem_max is set to a value greater than the value specified.").Int() - cacheSize = kingpin.Flag("statsd.cache-size", "Maximum size of your metric mapping cache. Relies on least recently used replacement policy if max size is reached.").Default("1000").Int() - cacheType = kingpin.Flag("statsd.cache-type", "Metric mapping cache type. Valid options are \"lru\" and \"random\"").Default("lru").Enum("lru", "random") - eventQueueSize = kingpin.Flag("statsd.event-queue-size", "Size of internal queue for processing events").Default("10000").Int() - eventFlushThreshold = kingpin.Flag("statsd.event-flush-threshold", "Number of events to hold in queue before flushing").Default("1000").Int() - eventFlushInterval = kingpin.Flag("statsd.event-flush-interval", "Number of events to hold in queue before flushing").Default("200ms").Duration() - dumpFSMPath = kingpin.Flag("debug.dump-fsm", "The path to dump internal FSM generated for glob matching as Dot file.").Default("").String() - ) - - promlogConfig := &promlog.Config{} - flag.AddFlags(kingpin.CommandLine, promlogConfig) - kingpin.Version(version.Print("statsd_exporter")) - kingpin.HelpFlag.Short('h') - kingpin.Parse() - logger := promlog.New(promlogConfig) - - cacheOption := mapper.WithCacheType(*cacheType) - - if *statsdListenUDP == "" && *statsdListenTCP == "" && *statsdListenUnixgram == "" { - level.Error(logger).Log("At least one of UDP/TCP/Unixgram listeners must be specified.") - os.Exit(1) - } - - level.Info(logger).Log("msg", "Starting StatsD -> Prometheus Exporter", "version", version.Info()) - level.Info(logger).Log("msg", "Build context", "context", version.BuildContext()) - level.Info(logger).Log("msg", "Accepting StatsD Traffic", "udp", *statsdListenUDP, "tcp", *statsdListenTCP, "unixgram", *statsdListenUnixgram) - level.Info(logger).Log("msg", "Accepting Prometheus Requests", "addr", *listenAddress) - - go serveHTTP(*listenAddress, *metricsEndpoint, logger) - - events := make(chan Events, *eventQueueSize) - defer close(events) - eventQueue := newEventQueue(events, *eventFlushThreshold, *eventFlushInterval) - - if *statsdListenUDP != "" { - udpListenAddr, err := udpAddrFromString(*statsdListenUDP) - if err != nil { - level.Error(logger).Log("msg", "invalid UDP listen address", "address", *statsdListenUDP, "error", err) - os.Exit(1) - } - uconn, err := net.ListenUDP("udp", udpListenAddr) - if err != nil { - level.Error(logger).Log("msg", "failed to start UDP listener", "error", err) - os.Exit(1) - } - - if *readBuffer != 0 { - err = uconn.SetReadBuffer(*readBuffer) - if err != nil { - level.Error(logger).Log("msg", "error setting UDP read buffer", "error", err) - os.Exit(1) - } - } - - ul := &StatsDUDPListener{conn: uconn, eventHandler: eventQueue, logger: logger} - go ul.Listen() - } - - if *statsdListenTCP != "" { - tcpListenAddr, err := tcpAddrFromString(*statsdListenTCP) - if err != nil { - level.Error(logger).Log("msg", "invalid TCP listen address", "address", *statsdListenUDP, "error", err) - os.Exit(1) - } - tconn, err := net.ListenTCP("tcp", tcpListenAddr) - if err != nil { - level.Error(logger).Log("msg", err) - os.Exit(1) - } - defer tconn.Close() - - tl := &StatsDTCPListener{conn: tconn, eventHandler: eventQueue, logger: logger} - go tl.Listen() - } - - if *statsdListenUnixgram != "" { - var err error - if _, err = os.Stat(*statsdListenUnixgram); !os.IsNotExist(err) { - level.Error(logger).Log("msg", "Unixgram socket already exists", "socket_name", *statsdListenUnixgram) - os.Exit(1) - } - uxgconn, err := net.ListenUnixgram("unixgram", &net.UnixAddr{ - Net: "unixgram", - Name: *statsdListenUnixgram, - }) - if err != nil { - level.Error(logger).Log("msg", "failed to listen on Unixgram socket", "error", err) - os.Exit(1) - } - - defer uxgconn.Close() - - if *readBuffer != 0 { - err = uxgconn.SetReadBuffer(*readBuffer) - if err != nil { - level.Error(logger).Log("msg", "error setting Unixgram read buffer", "error", err) - os.Exit(1) - } - } - - ul := &StatsDUnixgramListener{conn: uxgconn, eventHandler: eventQueue, logger: logger} - go ul.Listen() - - // if it's an abstract unix domain socket, it won't exist on fs - // so we can't chmod it either - if _, err := os.Stat(*statsdListenUnixgram); !os.IsNotExist(err) { - defer os.Remove(*statsdListenUnixgram) - - // convert the string to octet - perm, err := strconv.ParseInt("0"+string(*statsdUnixSocketMode), 8, 32) - if err != nil { - level.Warn(logger).Log("Bad permission %s: %v, ignoring\n", *statsdUnixSocketMode, err) - } else { - err = os.Chmod(*statsdListenUnixgram, os.FileMode(perm)) - if err != nil { - level.Warn(logger).Log("Failed to change unixgram socket permission: %v", err) - } - } - } - - } - - mapper := &mapper.MetricMapper{MappingsCount: mappingsCount} - if *mappingConfig != "" { - err := mapper.InitFromFile(*mappingConfig, *cacheSize, cacheOption) - if err != nil { - level.Error(logger).Log("msg", "error loading config", "error", err) - os.Exit(1) - } - if *dumpFSMPath != "" { - err := dumpFSM(mapper, *dumpFSMPath, logger) - if err != nil { - level.Error(logger).Log("msg", "error dumping FSM", "error", err) - // Failure to dump the FSM is an error (the user asked for it and it - // didn't happen) but not fatal (the exporter is fully functional - // afterwards). - } - } - } else { - mapper.InitCache(*cacheSize, cacheOption) - } - - go configReloader(*mappingConfig, mapper, *cacheSize, logger, cacheOption) - - exporter := NewExporter(mapper, logger) - - signals := make(chan os.Signal, 1) - signal.Notify(signals, os.Interrupt, syscall.SIGTERM) - - go exporter.Listen(events) - - <-signals -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "bufio" + "net" + "net/http" + _ "net/http/pprof" + "os" + "os/signal" + "strconv" + "syscall" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/prometheus/common/promlog" + "github.com/prometheus/common/promlog/flag" + "github.com/prometheus/common/version" + "gopkg.in/alecthomas/kingpin.v2" + + "github.com/prometheus/statsd_exporter/pkg/event" + "github.com/prometheus/statsd_exporter/pkg/exporter" + "github.com/prometheus/statsd_exporter/pkg/listener" + "github.com/prometheus/statsd_exporter/pkg/mapper" + "github.com/prometheus/statsd_exporter/pkg/util" +) + +const ( + defaultHelp = "Metric autogenerated by statsd_exporter." + regErrF = "Failed to update metric" +) + +var ( + eventStats = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "statsd_exporter_events_total", + Help: "The total number of StatsD events seen.", + }, + []string{"type"}, + ) + eventsFlushed = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_event_queue_flushed_total", + Help: "Number of times events were flushed to exporter", + }, + ) + eventsUnmapped = prometheus.NewCounter(prometheus.CounterOpts{ + Name: "statsd_exporter_events_unmapped_total", + Help: "The total number of StatsD events no mapping was found for.", + }) + udpPackets = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_udp_packets_total", + Help: "The total number of StatsD packets received over UDP.", + }, + ) + tcpConnections = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_tcp_connections_total", + Help: "The total number of TCP connections handled.", + }, + ) + tcpErrors = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_tcp_connection_errors_total", + Help: "The number of errors encountered reading from TCP.", + }, + ) + tcpLineTooLong = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_tcp_too_long_lines_total", + Help: "The number of lines discarded due to being too long.", + }, + ) + unixgramPackets = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_unixgram_packets_total", + Help: "The total number of StatsD packets received over Unixgram.", + }, + ) + linesReceived = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_lines_total", + Help: "The total number of StatsD lines received.", + }, + ) + samplesReceived = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_samples_total", + Help: "The total number of StatsD samples received.", + }, + ) + sampleErrors = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "statsd_exporter_sample_errors_total", + Help: "The total number of errors parsing StatsD samples.", + }, + []string{"reason"}, + ) + tagsReceived = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_tags_total", + Help: "The total number of DogStatsD tags processed.", + }, + ) + tagErrors = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_exporter_tag_errors_total", + Help: "The number of errors parsing DogStatsD tags.", + }, + ) + configLoads = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "statsd_exporter_config_reloads_total", + Help: "The number of configuration reloads.", + }, + []string{"outcome"}, + ) + mappingsCount = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "statsd_exporter_loaded_mappings", + Help: "The current number of configured metric mappings.", + }) + conflictingEventStats = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "statsd_exporter_events_conflict_total", + Help: "The total number of StatsD events with conflicting names.", + }, + []string{"type"}, + ) + errorEventStats = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "statsd_exporter_events_error_total", + Help: "The total number of StatsD events discarded due to errors.", + }, + []string{"reason"}, + ) + eventsActions = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "statsd_exporter_events_actions_total", + Help: "The total number of StatsD events by action.", + }, + []string{"action"}, + ) + metricsCount = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "statsd_exporter_metrics_total", + Help: "The total number of metrics.", + }, + []string{"type"}, + ) +) + +func init() { + prometheus.MustRegister(version.NewCollector("statsd_exporter")) + prometheus.MustRegister(eventStats) + prometheus.MustRegister(eventsFlushed) + prometheus.MustRegister(eventsUnmapped) + prometheus.MustRegister(udpPackets) + prometheus.MustRegister(tcpConnections) + prometheus.MustRegister(tcpErrors) + prometheus.MustRegister(tcpLineTooLong) + prometheus.MustRegister(unixgramPackets) + prometheus.MustRegister(linesReceived) + prometheus.MustRegister(samplesReceived) + prometheus.MustRegister(sampleErrors) + prometheus.MustRegister(tagsReceived) + prometheus.MustRegister(tagErrors) + prometheus.MustRegister(configLoads) + prometheus.MustRegister(mappingsCount) + prometheus.MustRegister(conflictingEventStats) + prometheus.MustRegister(errorEventStats) + prometheus.MustRegister(eventsActions) + prometheus.MustRegister(metricsCount) +} + +// uncheckedCollector wraps a Collector but its Describe method yields no Desc. +// This allows incoming metrics to have inconsistent label sets +type uncheckedCollector struct { + c prometheus.Collector +} + +func (u uncheckedCollector) Describe(_ chan<- *prometheus.Desc) {} +func (u uncheckedCollector) Collect(c chan<- prometheus.Metric) { + u.c.Collect(c) +} + +func serveHTTP(listenAddress, metricsEndpoint string, logger log.Logger) { + http.Handle(metricsEndpoint, promhttp.Handler()) + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(` + StatsD Exporter + +

StatsD Exporter

+

Metrics

+ + `)) + }) + level.Error(logger).Log("msg", http.ListenAndServe(listenAddress, nil)) + os.Exit(1) +} + +func configReloader(fileName string, mapper *mapper.MetricMapper, cacheSize int, logger log.Logger, option mapper.CacheOption) { + + signals := make(chan os.Signal, 1) + signal.Notify(signals, syscall.SIGHUP) + + for s := range signals { + if fileName == "" { + level.Warn(logger).Log("msg", "Received signal but no mapping config to reload", "signal", s) + continue + } + level.Info(logger).Log("msg", "Received signal, attempting reload", "signal", s) + err := mapper.InitFromFile(fileName, cacheSize, option) + if err != nil { + level.Info(logger).Log("msg", "Error reloading config", "error", err) + configLoads.WithLabelValues("failure").Inc() + } else { + level.Info(logger).Log("msg", "Config reloaded successfully") + configLoads.WithLabelValues("success").Inc() + } + } +} + +func dumpFSM(mapper *mapper.MetricMapper, dumpFilename string, logger log.Logger) error { + f, err := os.Create(dumpFilename) + if err != nil { + return err + } + level.Info(logger).Log("msg", "Start dumping FSM", "file_name", dumpFilename) + w := bufio.NewWriter(f) + mapper.FSM.DumpFSM(w) + w.Flush() + f.Close() + level.Info(logger).Log("msg", "Finish dumping FSM") + return nil +} + +func main() { + var ( + listenAddress = kingpin.Flag("web.listen-address", "The address on which to expose the web interface and generated Prometheus metrics.").Default(":9102").String() + metricsEndpoint = kingpin.Flag("web.telemetry-path", "Path under which to expose metrics.").Default("/metrics").String() + statsdListenUDP = kingpin.Flag("statsd.listen-udp", "The UDP address on which to receive statsd metric lines. \"\" disables it.").Default(":9125").String() + statsdListenTCP = kingpin.Flag("statsd.listen-tcp", "The TCP address on which to receive statsd metric lines. \"\" disables it.").Default(":9125").String() + statsdListenUnixgram = kingpin.Flag("statsd.listen-unixgram", "The Unixgram socket path to receive statsd metric lines in datagram. \"\" disables it.").Default("").String() + // not using Int here because flag diplays default in decimal, 0755 will show as 493 + statsdUnixSocketMode = kingpin.Flag("statsd.unixsocket-mode", "The permission mode of the unix socket.").Default("755").String() + mappingConfig = kingpin.Flag("statsd.mapping-config", "Metric mapping configuration file name.").String() + readBuffer = kingpin.Flag("statsd.read-buffer", "Size (in bytes) of the operating system's transmit read buffer associated with the UDP or Unixgram connection. Please make sure the kernel parameters net.core.rmem_max is set to a value greater than the value specified.").Int() + cacheSize = kingpin.Flag("statsd.cache-size", "Maximum size of your metric mapping cache. Relies on least recently used replacement policy if max size is reached.").Default("1000").Int() + cacheType = kingpin.Flag("statsd.cache-type", "Metric mapping cache type. Valid options are \"lru\" and \"random\"").Default("lru").Enum("lru", "random") + eventQueueSize = kingpin.Flag("statsd.event-queue-size", "Size of internal queue for processing events").Default("10000").Int() + eventFlushThreshold = kingpin.Flag("statsd.event-flush-threshold", "Number of events to hold in queue before flushing").Default("1000").Int() + eventFlushInterval = kingpin.Flag("statsd.event-flush-interval", "Number of events to hold in queue before flushing").Default("200ms").Duration() + dumpFSMPath = kingpin.Flag("debug.dump-fsm", "The path to dump internal FSM generated for glob matching as Dot file.").Default("").String() + ) + + promlogConfig := &promlog.Config{} + flag.AddFlags(kingpin.CommandLine, promlogConfig) + kingpin.Version(version.Print("statsd_exporter")) + kingpin.HelpFlag.Short('h') + kingpin.Parse() + logger := promlog.New(promlogConfig) + + cacheOption := mapper.WithCacheType(*cacheType) + + if *statsdListenUDP == "" && *statsdListenTCP == "" && *statsdListenUnixgram == "" { + level.Error(logger).Log("At least one of UDP/TCP/Unixgram listeners must be specified.") + os.Exit(1) + } + + level.Info(logger).Log("msg", "Starting StatsD -> Prometheus Exporter", "version", version.Info()) + level.Info(logger).Log("msg", "Build context", "context", version.BuildContext()) + level.Info(logger).Log("msg", "Accepting StatsD Traffic", "udp", *statsdListenUDP, "tcp", *statsdListenTCP, "unixgram", *statsdListenUnixgram) + level.Info(logger).Log("msg", "Accepting Prometheus Requests", "addr", *listenAddress) + + go serveHTTP(*listenAddress, *metricsEndpoint, logger) + + events := make(chan event.Events, *eventQueueSize) + defer close(events) + eventQueue := event.NewEventQueue(events, *eventFlushThreshold, *eventFlushInterval, eventsFlushed) + + if *statsdListenUDP != "" { + udpListenAddr, err := util.UDPAddrFromString(*statsdListenUDP) + if err != nil { + level.Error(logger).Log("msg", "invalid UDP listen address", "address", *statsdListenUDP, "error", err) + os.Exit(1) + } + uconn, err := net.ListenUDP("udp", udpListenAddr) + if err != nil { + level.Error(logger).Log("msg", "failed to start UDP listener", "error", err) + os.Exit(1) + } + + if *readBuffer != 0 { + err = uconn.SetReadBuffer(*readBuffer) + if err != nil { + level.Error(logger).Log("msg", "error setting UDP read buffer", "error", err) + os.Exit(1) + } + } + + ul := &listener.StatsDUDPListener{Conn: uconn, EventHandler: eventQueue, Logger: logger} + go ul.Listen(udpPackets, linesReceived, eventsFlushed, *sampleErrors, samplesReceived, tagErrors, tagsReceived) + } + + if *statsdListenTCP != "" { + tcpListenAddr, err := util.TCPAddrFromString(*statsdListenTCP) + if err != nil { + level.Error(logger).Log("msg", "invalid TCP listen address", "address", *statsdListenUDP, "error", err) + os.Exit(1) + } + tconn, err := net.ListenTCP("tcp", tcpListenAddr) + if err != nil { + level.Error(logger).Log("msg", err) + os.Exit(1) + } + defer tconn.Close() + + tl := &listener.StatsDTCPListener{Conn: tconn, EventHandler: eventQueue, Logger: logger} + go tl.Listen(linesReceived, eventsFlushed, tcpConnections, tcpErrors, tcpLineTooLong, *sampleErrors, samplesReceived, tagErrors, tagsReceived) + } + + if *statsdListenUnixgram != "" { + var err error + if _, err = os.Stat(*statsdListenUnixgram); !os.IsNotExist(err) { + level.Error(logger).Log("msg", "Unixgram socket already exists", "socket_name", *statsdListenUnixgram) + os.Exit(1) + } + uxgconn, err := net.ListenUnixgram("unixgram", &net.UnixAddr{ + Net: "unixgram", + Name: *statsdListenUnixgram, + }) + if err != nil { + level.Error(logger).Log("msg", "failed to listen on Unixgram socket", "error", err) + os.Exit(1) + } + + defer uxgconn.Close() + + if *readBuffer != 0 { + err = uxgconn.SetReadBuffer(*readBuffer) + if err != nil { + level.Error(logger).Log("msg", "error setting Unixgram read buffer", "error", err) + os.Exit(1) + } + } + + ul := &listener.StatsDUnixgramListener{Conn: uxgconn, EventHandler: eventQueue, Logger: logger} + go ul.Listen(unixgramPackets, linesReceived, eventsFlushed, *sampleErrors, samplesReceived, tagErrors, tagsReceived) + + // if it's an abstract unix domain socket, it won't exist on fs + // so we can't chmod it either + if _, err := os.Stat(*statsdListenUnixgram); !os.IsNotExist(err) { + defer os.Remove(*statsdListenUnixgram) + + // convert the string to octet + perm, err := strconv.ParseInt("0"+string(*statsdUnixSocketMode), 8, 32) + if err != nil { + level.Warn(logger).Log("Bad permission %s: %v, ignoring\n", *statsdUnixSocketMode, err) + } else { + err = os.Chmod(*statsdListenUnixgram, os.FileMode(perm)) + if err != nil { + level.Warn(logger).Log("Failed to change unixgram socket permission: %v", err) + } + } + } + + } + + mapper := &mapper.MetricMapper{MappingsCount: mappingsCount} + if *mappingConfig != "" { + err := mapper.InitFromFile(*mappingConfig, *cacheSize, cacheOption) + if err != nil { + level.Error(logger).Log("msg", "error loading config", "error", err) + os.Exit(1) + } + if *dumpFSMPath != "" { + err := dumpFSM(mapper, *dumpFSMPath, logger) + if err != nil { + level.Error(logger).Log("msg", "error dumping FSM", "error", err) + // Failure to dump the FSM is an error (the user asked for it and it + // didn't happen) but not fatal (the exporter is fully functional + // afterwards). + } + } + } else { + mapper.InitCache(*cacheSize, cacheOption) + } + + go configReloader(*mappingConfig, mapper, *cacheSize, logger, cacheOption) + + exporter := exporter.NewExporter(mapper, logger) + + signals := make(chan os.Signal, 1) + signal.Notify(signals, os.Interrupt, syscall.SIGTERM) + + go exporter.Listen(events, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + + <-signals +} diff --git a/pkg/clock/clock.go b/pkg/clock/clock.go index 27e631b..408d4ff 100644 --- a/pkg/clock/clock.go +++ b/pkg/clock/clock.go @@ -1,41 +1,41 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package clock - -import ( - "time" -) - -var ClockInstance *Clock - -type Clock struct { - Instant time.Time - TickerCh chan time.Time -} - -func Now() time.Time { - if ClockInstance == nil { - return time.Now() - } - return ClockInstance.Instant -} - -func NewTicker(d time.Duration) *time.Ticker { - if ClockInstance == nil || ClockInstance.TickerCh == nil { - return time.NewTicker(d) - } - return &time.Ticker{ - C: ClockInstance.TickerCh, - } -} +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clock + +import ( + "time" +) + +var ClockInstance *Clock + +type Clock struct { + Instant time.Time + TickerCh chan time.Time +} + +func Now() time.Time { + if ClockInstance == nil { + return time.Now() + } + return ClockInstance.Instant +} + +func NewTicker(d time.Duration) *time.Ticker { + if ClockInstance == nil || ClockInstance.TickerCh == nil { + return time.NewTicker(d) + } + return &time.Ticker{ + C: ClockInstance.TickerCh, + } +} diff --git a/pkg/event.go~ b/pkg/event.go~ new file mode 100644 index 0000000..3bc8a8e --- /dev/null +++ b/pkg/event.go~ @@ -0,0 +1,133 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "sync" + "time" + + "github.com/prometheus/statsd_exporter/pkg/clock" + "github.com/prometheus/statsd_exporter/pkg/mapper" +) + +type Event interface { + MetricName() string + Value() float64 + Labels() map[string]string + MetricType() mapper.MetricType +} + +type CounterEvent struct { + metricName string + value float64 + labels map[string]string +} + +func (c *CounterEvent) MetricName() string { return c.metricName } +func (c *CounterEvent) Value() float64 { return c.value } +func (c *CounterEvent) Labels() map[string]string { return c.labels } +func (c *CounterEvent) MetricType() mapper.MetricType { return mapper.MetricTypeCounter } + +type GaugeEvent struct { + metricName string + value float64 + relative bool + labels map[string]string +} + +func (g *GaugeEvent) MetricName() string { return g.metricName } +func (g *GaugeEvent) Value() float64 { return g.value } +func (c *GaugeEvent) Labels() map[string]string { return c.labels } +func (c *GaugeEvent) MetricType() mapper.MetricType { return mapper.MetricTypeGauge } + +type TimerEvent struct { + metricName string + value float64 + labels map[string]string +} + +func (t *TimerEvent) MetricName() string { return t.metricName } +func (t *TimerEvent) Value() float64 { return t.value } +func (c *TimerEvent) Labels() map[string]string { return c.labels } +func (c *TimerEvent) MetricType() mapper.MetricType { return mapper.MetricTypeTimer } + +type Events []Event + +type eventQueue struct { + c chan Events + q Events + m sync.Mutex + flushThreshold int + flushTicker *time.Ticker +} + +type eventHandler interface { + queue(event Events) +} + +func newEventQueue(c chan Events, flushThreshold int, flushInterval time.Duration) *eventQueue { + ticker := clock.NewTicker(flushInterval) + eq := &eventQueue{ + c: c, + flushThreshold: flushThreshold, + flushTicker: ticker, + q: make([]Event, 0, flushThreshold), + } + go func() { + for { + <-ticker.C + eq.flush() + } + }() + return eq +} + +func (eq *eventQueue) queue(events Events) { + eq.m.Lock() + defer eq.m.Unlock() + + for _, e := range events { + eq.q = append(eq.q, e) + if len(eq.q) >= eq.flushThreshold { + eq.flushUnlocked() + } + } +} + +func (eq *eventQueue) flush() { + eq.m.Lock() + defer eq.m.Unlock() + eq.flushUnlocked() +} + +func (eq *eventQueue) flushUnlocked() { + eq.c <- eq.q + eq.q = make([]Event, 0, cap(eq.q)) + eventsFlushed.Inc() +} + +func (eq *eventQueue) len() int { + eq.m.Lock() + defer eq.m.Unlock() + + return len(eq.q) +} + +type unbufferedEventHandler struct { + c chan Events +} + +func (ueh *unbufferedEventHandler) queue(events Events) { + ueh.c <- events +} diff --git a/pkg/event/event.go b/pkg/event/event.go new file mode 100644 index 0000000..8175e3a --- /dev/null +++ b/pkg/event/event.go @@ -0,0 +1,134 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package event + +import ( + "sync" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/clock" + "github.com/prometheus/statsd_exporter/pkg/mapper" +) + +type Event interface { + MetricName() string + Value() float64 + Labels() map[string]string + MetricType() mapper.MetricType +} + +type CounterEvent struct { + CMetricName string + CValue float64 + CLabels map[string]string +} + +func (c *CounterEvent) MetricName() string { return c.CMetricName } +func (c *CounterEvent) Value() float64 { return c.CValue } +func (c *CounterEvent) Labels() map[string]string { return c.CLabels } +func (c *CounterEvent) MetricType() mapper.MetricType { return mapper.MetricTypeCounter } + +type GaugeEvent struct { + GMetricName string + GValue float64 + GRelative bool + GLabels map[string]string +} + +func (g *GaugeEvent) MetricName() string { return g.GMetricName } +func (g *GaugeEvent) Value() float64 { return g.GValue } +func (c *GaugeEvent) Labels() map[string]string { return c.GLabels } +func (c *GaugeEvent) MetricType() mapper.MetricType { return mapper.MetricTypeGauge } + +type TimerEvent struct { + TMetricName string + TValue float64 + TLabels map[string]string +} + +func (t *TimerEvent) MetricName() string { return t.TMetricName } +func (t *TimerEvent) Value() float64 { return t.TValue } +func (c *TimerEvent) Labels() map[string]string { return c.TLabels } +func (c *TimerEvent) MetricType() mapper.MetricType { return mapper.MetricTypeTimer } + +type Events []Event + +type EventQueue struct { + C chan Events + q Events + m sync.Mutex + flushThreshold int + flushTicker *time.Ticker +} + +type EventHandler interface { + Queue(event Events, eventsFlushed *prometheus.Counter) +} + +func NewEventQueue(c chan Events, flushThreshold int, flushInterval time.Duration, eventsFlushed prometheus.Counter) *EventQueue { + ticker := clock.NewTicker(flushInterval) + eq := &EventQueue{ + C: c, + flushThreshold: flushThreshold, + flushTicker: ticker, + q: make([]Event, 0, flushThreshold), + } + go func() { + for { + <-ticker.C + eq.Flush(eventsFlushed) + } + }() + return eq +} + +func (eq *EventQueue) Queue(events Events, eventsFlushed *prometheus.Counter) { + eq.m.Lock() + defer eq.m.Unlock() + + for _, e := range events { + eq.q = append(eq.q, e) + if len(eq.q) >= eq.flushThreshold { + eq.FlushUnlocked(*eventsFlushed) + } + } +} + +func (eq *EventQueue) Flush(eventsFlushed prometheus.Counter) { + eq.m.Lock() + defer eq.m.Unlock() + eq.FlushUnlocked(eventsFlushed) +} + +func (eq *EventQueue) FlushUnlocked(eventsFlushed prometheus.Counter) { + eq.C <- eq.q + eq.q = make([]Event, 0, cap(eq.q)) + eventsFlushed.Inc() +} + +func (eq *EventQueue) Len() int { + eq.m.Lock() + defer eq.m.Unlock() + + return len(eq.q) +} + +type UnbufferedEventHandler struct { + C chan Events +} + +func (ueh *UnbufferedEventHandler) Queue(events Events, eventsFlushed *prometheus.Counter) { + ueh.C <- events +} diff --git a/pkg/event/event.go~ b/pkg/event/event.go~ new file mode 100644 index 0000000..e17b223 --- /dev/null +++ b/pkg/event/event.go~ @@ -0,0 +1,134 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package event + +import ( + "sync" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/clock" + "github.com/prometheus/statsd_exporter/pkg/mapper" +) + +type Event interface { + MetricName() string + Value() float64 + Labels() map[string]string + MetricType() mapper.MetricType +} + +type CounterEvent struct { + CMetricName string + CValue float64 + CLabels map[string]string +} + +func (c *CounterEvent) MetricName() string { return c.CMetricName } +func (c *CounterEvent) Value() float64 { return c.CValue } +func (c *CounterEvent) Labels() map[string]string { return c.CLabels } +func (c *CounterEvent) MetricType() mapper.MetricType { return mapper.MetricTypeCounter } + +type GaugeEvent struct { + GMetricName string + GValue float64 + GRelative bool + GLabels map[string]string +} + +func (g *GaugeEvent) MetricName() string { return g.GMetricName } +func (g *GaugeEvent) Value() float64 { return g.GValue } +func (c *GaugeEvent) Labels() map[string]string { return c.GLabels } +func (c *GaugeEvent) MetricType() mapper.MetricType { return mapper.MetricTypeGauge } + +type TimerEvent struct { + TMetricName string + TValue float64 + TLabels map[string]string +} + +func (t *TimerEvent) MetricName() string { return t.TMetricName } +func (t *TimerEvent) Value() float64 { return t.TValue } +func (c *TimerEvent) Labels() map[string]string { return c.TLabels } +func (c *TimerEvent) MetricType() mapper.MetricType { return mapper.MetricTypeTimer } + +type Events []Event + +type EventQueue struct { + C chan Events + q Events + m sync.Mutex + flushThreshold int + flushTicker *time.Ticker +} + +type EventHandler interface { + Queue(event Events, eventsFlushed *prometheus.Counter) +} + +func NewEventQueue(c chan Events, flushThreshold int, flushInterval time.Duration, eventsFlushed prometheus.Counter) *EventQueue { + ticker := clock.NewTicker(flushInterval) + eq := &EventQueue{ + C: c, + flushThreshold: flushThreshold, + flushTicker: ticker, + q: make([]Event, 0, flushThreshold), + } + go func() { + for { + <-ticker.C + eq.Flush(eventsFlushed) + } + }() + return eq +} + +func (eq *EventQueue) Queue(events Events, eventsFlushed *prometheus.Counter) { + eq.m.Lock() + defer eq.m.Unlock() + + for _, e := range events { + eq.q = append(eq.q, e) + if len(eq.q) >= eq.flushThreshold { + eq.FlushUnlocked(*eventsFlushed) + } + } +} + +func (eq *EventQueue) Flush(eventsFlushed prometheus.Counter) { + eq.m.Lock() + defer eq.m.Unlock() + eq.FlushUnlocked(eventsFlushed) +} + +func (eq *EventQueue) FlushUnlocked(eventsFlushed prometheus.Counter) { + eq.C <- eq.q + eq.q = make([]Event, 0, cap(eq.q)) + eventsFlushed.Inc() +} + +func (eq *EventQueue) Len() int { + eq.m.Lock() + defer eq.m.Unlock() + + return len(eq.q) +} + +type UnbufferedEventHandler struct { + C chan Events +} + +func (ueh *UnbufferedEventHandler) Queue(events Events) { + ueh.C <- events +} diff --git a/pkg/exporter/exporter.go b/pkg/exporter/exporter.go new file mode 100644 index 0000000..c7cde63 --- /dev/null +++ b/pkg/exporter/exporter.go @@ -0,0 +1,173 @@ +package exporter + +import ( + "os" + "time" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/clock" + "github.com/prometheus/statsd_exporter/pkg/event" + "github.com/prometheus/statsd_exporter/pkg/mapper" + "github.com/prometheus/statsd_exporter/pkg/registry" +) + +const ( + defaultHelp = "Metric autogenerated by statsd_exporter." + regErrF = "Failed to update metric" +) + +type Exporter struct { + Mapper *mapper.MetricMapper + Registry *registry.Registry + Logger log.Logger +} + +// Listen handles all events sent to the given channel sequentially. It +// terminates when the channel is closed. +func (b *Exporter) Listen(e <-chan event.Events, eventsActions *prometheus.CounterVec, eventsUnmapped prometheus.Counter, + errorEventStats *prometheus.CounterVec, eventStats *prometheus.CounterVec, conflictingEventStats *prometheus.CounterVec, metricsCount *prometheus.GaugeVec) { + + removeStaleMetricsTicker := clock.NewTicker(time.Second) + + for { + select { + case <-removeStaleMetricsTicker.C: + b.Registry.RemoveStaleMetrics() + case events, ok := <-e: + if !ok { + level.Debug(b.Logger).Log("msg", "Channel is closed. Break out of Exporter.Listener.") + removeStaleMetricsTicker.Stop() + return + } + for _, event := range events { + b.handleEvent(event, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + } + } + } +} + +// handleEvent processes a single Event according to the configured mapping. +func (b *Exporter) handleEvent(thisEvent event.Event, eventsActions *prometheus.CounterVec, eventsUnmapped prometheus.Counter, + errorEventStats *prometheus.CounterVec, eventStats *prometheus.CounterVec, conflictingEventStats *prometheus.CounterVec, metricsCount *prometheus.GaugeVec) { + + mapping, labels, present := b.Mapper.GetMapping(thisEvent.MetricName(), thisEvent.MetricType()) + if mapping == nil { + mapping = &mapper.MetricMapping{} + if b.Mapper.Defaults.Ttl != 0 { + mapping.Ttl = b.Mapper.Defaults.Ttl + } + } + + if mapping.Action == mapper.ActionTypeDrop { + eventsActions.WithLabelValues("drop").Inc() + return + } + + metricName := "" + + help := defaultHelp + if mapping.HelpText != "" { + help = mapping.HelpText + } + + prometheusLabels := thisEvent.Labels() + if present { + if mapping.Name == "" { + level.Debug(b.Logger).Log("msg", "The mapping generates an empty metric name", "metric_name", thisEvent.MetricName(), "match", mapping.Match) + errorEventStats.WithLabelValues("empty_metric_name").Inc() + return + } + metricName = mapper.EscapeMetricName(mapping.Name) + for label, value := range labels { + prometheusLabels[label] = value + } + eventsActions.WithLabelValues(string(mapping.Action)).Inc() + } else { + eventsUnmapped.Inc() + metricName = mapper.EscapeMetricName(thisEvent.MetricName()) + } + + switch ev := thisEvent.(type) { + case *event.CounterEvent: + // We don't accept negative values for counters. Incrementing the counter with a negative number + // will cause the exporter to panic. Instead we will warn and continue to the next event. + if thisEvent.Value() < 0.0 { + level.Debug(b.Logger).Log("msg", "counter must be non-negative value", "metric", metricName, "event_value", thisEvent.Value()) + errorEventStats.WithLabelValues("illegal_negative_counter").Inc() + return + } + + counter, err := b.Registry.GetCounter(metricName, prometheusLabels, help, mapping, metricsCount) + if err == nil { + counter.Add(thisEvent.Value()) + eventStats.WithLabelValues("counter").Inc() + } else { + level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + conflictingEventStats.WithLabelValues("counter").Inc() + } + + case *event.GaugeEvent: + gauge, err := b.Registry.GetGauge(metricName, prometheusLabels, help, mapping, metricsCount) + + if err == nil { + if ev.GRelative { + gauge.Add(thisEvent.Value()) + } else { + gauge.Set(thisEvent.Value()) + } + eventStats.WithLabelValues("gauge").Inc() + } else { + level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + conflictingEventStats.WithLabelValues("gauge").Inc() + } + + case *event.TimerEvent: + t := mapper.TimerTypeDefault + if mapping != nil { + t = mapping.TimerType + } + if t == mapper.TimerTypeDefault { + t = b.Mapper.Defaults.TimerType + } + + switch t { + case mapper.TimerTypeHistogram: + histogram, err := b.Registry.GetHistogram(metricName, prometheusLabels, help, mapping, metricsCount) + if err == nil { + histogram.Observe(thisEvent.Value() / 1000) // prometheus presumes seconds, statsd millisecond + eventStats.WithLabelValues("timer").Inc() + } else { + level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + conflictingEventStats.WithLabelValues("timer").Inc() + } + + case mapper.TimerTypeDefault, mapper.TimerTypeSummary: + summary, err := b.Registry.GetSummary(metricName, prometheusLabels, help, mapping, metricsCount) + if err == nil { + summary.Observe(thisEvent.Value() / 1000) // prometheus presumes seconds, statsd millisecond + eventStats.WithLabelValues("timer").Inc() + } else { + level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + conflictingEventStats.WithLabelValues("timer").Inc() + } + + default: + level.Error(b.Logger).Log("msg", "unknown timer type", "type", t) + os.Exit(1) + } + + default: + level.Debug(b.Logger).Log("msg", "Unsupported event type") + eventStats.WithLabelValues("illegal").Inc() + } +} + +func NewExporter(mapper *mapper.MetricMapper, logger log.Logger) *Exporter { + return &Exporter{ + Mapper: mapper, + Registry: registry.NewRegistry(mapper), + Logger: logger, + } +} diff --git a/pkg/exporter/exporter.go~ b/pkg/exporter/exporter.go~ new file mode 100644 index 0000000..6fcd288 --- /dev/null +++ b/pkg/exporter/exporter.go~ @@ -0,0 +1,172 @@ +package exporter + +import ( + "os" + "time" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/clock" + "github.com/prometheus/statsd_exporter/pkg/event" + "github.com/prometheus/statsd_exporter/pkg/mapper" + "github.com/prometheus/statsd_exporter/pkg/registry" +) + +const ( + defaultHelp = "Metric autogenerated by statsd_exporter." + regErrF = "Failed to update metric" +) + +type Exporter struct { + Mapper *mapper.MetricMapper + Registry *registry.Registry + Logger log.Logger +} + +// Listen handles all events sent to the given channel sequentially. It +// terminates when the channel is closed. +func (b *Exporter) Listen(e <-chan event.Events, thisEvent event.Event, eventsActions prometheus.GaugeVec, eventsUnmapped prometheus.Gauge, + errorEventStats prometheus.GaugeVec, eventStats prometheus.GaugeVec, conflictingEventStats prometheus.GaugeVec, metricsCount prometheus.GaugeVec, l func(string, log.Logger)) { + removeStaleMetricsTicker := clock.NewTicker(time.Second) + + for { + select { + case <-removeStaleMetricsTicker.C: + b.Registry.RemoveStaleMetrics() + case events, ok := <-e: + if !ok { + level.Debug(b.Logger).Log("msg", "Channel is closed. Break out of Exporter.Listener.") + removeStaleMetricsTicker.Stop() + return + } + for _, event := range events { + b.handleEvent(event, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount, l) + } + } + } +} + +// handleEvent processes a single Event according to the configured mapping. +func (b *Exporter) handleEvent(thisEvent event.Event, eventsActions prometheus.GaugeVec, eventsUnmapped prometheus.Gauge, + errorEventStats prometheus.GaugeVec, eventStats prometheus.GaugeVec, conflictingEventStats prometheus.GaugeVec, metricsCount prometheus.GaugeVec, l func(string, log.Logger)) { + + mapping, labels, present := b.Mapper.GetMapping(thisEvent.MetricName(), thisEvent.MetricType()) + if mapping == nil { + mapping = &mapper.MetricMapping{} + if b.Mapper.Defaults.Ttl != 0 { + mapping.Ttl = b.Mapper.Defaults.Ttl + } + } + + if mapping.Action == mapper.ActionTypeDrop { + eventsActions.WithLabelValues("drop").Inc() + return + } + + metricName := "" + + help := defaultHelp + if mapping.HelpText != "" { + help = mapping.HelpText + } + + prometheusLabels := thisEvent.Labels() + if present { + if mapping.Name == "" { + level.Debug(b.Logger).Log("msg", "The mapping generates an empty metric name", "metric_name", thisEvent.MetricName(), "match", mapping.Match) + errorEventStats.WithLabelValues("empty_metric_name").Inc() + return + } + metricName = mapper.EscapeMetricName(mapping.Name) + for label, value := range labels { + prometheusLabels[label] = value + } + eventsActions.WithLabelValues(string(mapping.Action)).Inc() + } else { + eventsUnmapped.Inc() + metricName = mapper.EscapeMetricName(thisEvent.MetricName()) + } + + switch ev := thisEvent.(type) { + case *event.CounterEvent: + // We don't accept negative values for counters. Incrementing the counter with a negative number + // will cause the exporter to panic. Instead we will warn and continue to the next event. + if thisEvent.Value() < 0.0 { + level.Debug(b.Logger).Log("msg", "counter must be non-negative value", "metric", metricName, "event_value", thisEvent.Value()) + errorEventStats.WithLabelValues("illegal_negative_counter").Inc() + return + } + + counter, err := b.Registry.GetCounter(metricName, prometheusLabels, help, mapping, &metricsCount) + if err == nil { + counter.Add(thisEvent.Value()) + eventStats.WithLabelValues("counter").Inc() + } else { + level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + conflictingEventStats.WithLabelValues("counter").Inc() + } + + case *event.GaugeEvent: + gauge, err := b.Registry.GetGauge(metricName, prometheusLabels, help, mapping, &metricsCount) + + if err == nil { + if ev.GRelative { + gauge.Add(thisEvent.Value()) + } else { + gauge.Set(thisEvent.Value()) + } + eventStats.WithLabelValues("gauge").Inc() + } else { + level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + conflictingEventStats.WithLabelValues("gauge").Inc() + } + + case *event.TimerEvent: + t := mapper.TimerTypeDefault + if mapping != nil { + t = mapping.TimerType + } + if t == mapper.TimerTypeDefault { + t = b.Mapper.Defaults.TimerType + } + + switch t { + case mapper.TimerTypeHistogram: + histogram, err := b.Registry.GetHistogram(metricName, prometheusLabels, help, mapping, &metricsCount) + if err == nil { + histogram.Observe(thisEvent.Value() / 1000) // prometheus presumes seconds, statsd millisecond + eventStats.WithLabelValues("timer").Inc() + } else { + level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + conflictingEventStats.WithLabelValues("timer").Inc() + } + + case mapper.TimerTypeDefault, mapper.TimerTypeSummary: + summary, err := b.Registry.GetSummary(metricName, prometheusLabels, help, mapping, &metricsCount) + if err == nil { + summary.Observe(thisEvent.Value() / 1000) // prometheus presumes seconds, statsd millisecond + eventStats.WithLabelValues("timer").Inc() + } else { + level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + conflictingEventStats.WithLabelValues("timer").Inc() + } + + default: + level.Error(b.Logger).Log("msg", "unknown timer type", "type", t) + os.Exit(1) + } + + default: + level.Debug(b.Logger).Log("msg", "Unsupported event type") + eventStats.WithLabelValues("illegal").Inc() + } +} + +func NewExporter(mapper *mapper.MetricMapper, logger log.Logger) *Exporter { + return &Exporter{ + Mapper: mapper, + Registry: registry.NewRegistry(mapper), + Logger: logger, + } +} diff --git a/pkg/line/line.go b/pkg/line/line.go new file mode 100644 index 0000000..5a0a6c3 --- /dev/null +++ b/pkg/line/line.go @@ -0,0 +1,241 @@ +package line + +import ( + "fmt" + "strconv" + "strings" + "unicode/utf8" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/event" + "github.com/prometheus/statsd_exporter/pkg/mapper" +) + +func buildEvent(statType, metric string, value float64, relative bool, labels map[string]string) (event.Event, error) { + switch statType { + case "c": + return &event.CounterEvent{ + CMetricName: metric, + CValue: float64(value), + CLabels: labels, + }, nil + case "g": + return &event.GaugeEvent{ + GMetricName: metric, + GValue: float64(value), + GRelative: relative, + GLabels: labels, + }, nil + case "ms", "h", "d": + return &event.TimerEvent{ + TMetricName: metric, + TValue: float64(value), + TLabels: labels, + }, nil + case "s": + return nil, fmt.Errorf("no support for StatsD sets") + default: + return nil, fmt.Errorf("bad stat type %s", statType) + } +} + +func parseTag(component, tag string, separator rune, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) { + // Entirely empty tag is an error + if len(tag) == 0 { + tagErrors.Inc() + level.Debug(logger).Log("msg", "Empty name tag", "component", component) + return + } + + for i, c := range tag { + if c == separator { + k := tag[:i] + v := tag[i+1:] + + if len(k) == 0 || len(v) == 0 { + // Empty key or value is an error + tagErrors.Inc() + level.Debug(logger).Log("msg", "Malformed name tag", "k", k, "v", v, "component", component) + } else { + labels[mapper.EscapeMetricName(k)] = v + } + return + } + } + + // Missing separator (no value) is an error + tagErrors.Inc() + level.Debug(logger).Log("msg", "Malformed name tag", "tag", tag, "component", component) +} + +func parseNameTags(component string, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) { + lastTagEndIndex := 0 + for i, c := range component { + if c == ',' { + tag := component[lastTagEndIndex:i] + lastTagEndIndex = i + 1 + parseTag(component, tag, '=', labels, tagErrors, logger) + } + } + + // If we're not off the end of the string, add the last tag + if lastTagEndIndex < len(component) { + tag := component[lastTagEndIndex:] + parseTag(component, tag, '=', labels, tagErrors, logger) + } +} + +func trimLeftHash(s string) string { + if s != "" && s[0] == '#' { + return s[1:] + } + return s +} + +func ParseDogStatsDTags(component string, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) { + lastTagEndIndex := 0 + for i, c := range component { + if c == ',' { + tag := component[lastTagEndIndex:i] + lastTagEndIndex = i + 1 + parseTag(component, trimLeftHash(tag), ':', labels, tagErrors, logger) + } + } + + // If we're not off the end of the string, add the last tag + if lastTagEndIndex < len(component) { + tag := component[lastTagEndIndex:] + parseTag(component, trimLeftHash(tag), ':', labels, tagErrors, logger) + } +} + +func parseNameAndTags(name string, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) string { + for i, c := range name { + // `#` delimits start of tags by Librato + // https://www.librato.com/docs/kb/collect/collection_agents/stastd/#stat-level-tags + // `,` delimits start of tags by InfluxDB + // https://www.influxdata.com/blog/getting-started-with-sending-statsd-metrics-to-telegraf-influxdb/#introducing-influx-statsd + if c == '#' || c == ',' { + parseNameTags(name[i+1:], labels, tagErrors, logger) + return name[:i] + } + } + return name +} + +func LineToEvents(line string, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter, logger log.Logger) event.Events { + events := event.Events{} + if line == "" { + return events + } + + elements := strings.SplitN(line, ":", 2) + if len(elements) < 2 || len(elements[0]) == 0 || !utf8.ValidString(line) { + sampleErrors.WithLabelValues("malformed_line").Inc() + level.Debug(logger).Log("msg", "Bad line from StatsD", "line", line) + return events + } + + labels := map[string]string{} + metric := parseNameAndTags(elements[0], labels, tagErrors, logger) + + var samples []string + if strings.Contains(elements[1], "|#") { + // using DogStatsD tags + + // don't allow mixed tagging styles + if len(labels) > 0 { + sampleErrors.WithLabelValues("mixed_tagging_styles").Inc() + level.Debug(logger).Log("msg", "Bad line (multiple tagging styles) from StatsD", "line", line) + return events + } + + // disable multi-metrics + samples = elements[1:] + } else { + samples = strings.Split(elements[1], ":") + } + +samples: + for _, sample := range samples { + samplesReceived.Inc() + components := strings.Split(sample, "|") + samplingFactor := 1.0 + if len(components) < 2 || len(components) > 4 { + sampleErrors.WithLabelValues("malformed_component").Inc() + level.Debug(logger).Log("msg", "Bad component", "line", line) + continue + } + valueStr, statType := components[0], components[1] + + var relative = false + if strings.Index(valueStr, "+") == 0 || strings.Index(valueStr, "-") == 0 { + relative = true + } + + value, err := strconv.ParseFloat(valueStr, 64) + if err != nil { + level.Debug(logger).Log("msg", "Bad value", "value", valueStr, "line", line) + sampleErrors.WithLabelValues("malformed_value").Inc() + continue + } + + multiplyEvents := 1 + if len(components) >= 3 { + for _, component := range components[2:] { + if len(component) == 0 { + level.Debug(logger).Log("msg", "Empty component", "line", line) + sampleErrors.WithLabelValues("malformed_component").Inc() + continue samples + } + } + + for _, component := range components[2:] { + switch component[0] { + case '@': + + samplingFactor, err = strconv.ParseFloat(component[1:], 64) + if err != nil { + level.Debug(logger).Log("msg", "Invalid sampling factor", "component", component[1:], "line", line) + sampleErrors.WithLabelValues("invalid_sample_factor").Inc() + } + if samplingFactor == 0 { + samplingFactor = 1 + } + + if statType == "g" { + continue + } else if statType == "c" { + value /= samplingFactor + } else if statType == "ms" || statType == "h" || statType == "d" { + multiplyEvents = int(1 / samplingFactor) + } + case '#': + ParseDogStatsDTags(component[1:], labels, tagErrors, logger) + default: + level.Debug(logger).Log("msg", "Invalid sampling factor or tag section", "component", components[2], "line", line) + sampleErrors.WithLabelValues("invalid_sample_factor").Inc() + continue + } + } + } + + if len(labels) > 0 { + tagsReceived.Inc() + } + + for i := 0; i < multiplyEvents; i++ { + event, err := buildEvent(statType, metric, value, relative, labels) + if err != nil { + level.Debug(logger).Log("msg", "Error building event", "line", line, "error", err) + sampleErrors.WithLabelValues("illegal_event").Inc() + continue + } + events = append(events, event) + } + } + return events +} diff --git a/pkg/line/line.go~ b/pkg/line/line.go~ new file mode 100644 index 0000000..af7a7bb --- /dev/null +++ b/pkg/line/line.go~ @@ -0,0 +1,241 @@ +package line + +import ( + "fmt" + "strconv" + "strings" + "unicode/utf8" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/event" + "github.com/prometheus/statsd_exporter/pkg/mapper" +) + +func buildEvent(statType, metric string, value float64, relative bool, labels map[string]string) (event.Event, error) { + switch statType { + case "c": + return &event.CounterEvent{ + CMetricName: metric, + CValue: float64(value), + CLabels: labels, + }, nil + case "g": + return &event.GaugeEvent{ + GMetricName: metric, + GValue: float64(value), + GRelative: relative, + GLabels: labels, + }, nil + case "ms", "h", "d": + return &event.TimerEvent{ + TMetricName: metric, + TValue: float64(value), + TLabels: labels, + }, nil + case "s": + return nil, fmt.Errorf("no support for StatsD sets") + default: + return nil, fmt.Errorf("bad stat type %s", statType) + } +} + +func parseTag(component, tag string, separator rune, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) { + // Entirely empty tag is an error + if len(tag) == 0 { + tagErrors.Inc() + level.Debug(logger).Log("msg", "Empty name tag", "component", component) + return + } + + for i, c := range tag { + if c == separator { + k := tag[:i] + v := tag[i+1:] + + if len(k) == 0 || len(v) == 0 { + // Empty key or value is an error + tagErrors.Inc() + level.Debug(logger).Log("msg", "Malformed name tag", "k", k, "v", v, "component", component) + } else { + labels[mapper.EscapeMetricName(k)] = v + } + return + } + } + + // Missing separator (no value) is an error + tagErrors.Inc() + level.Debug(logger).Log("msg", "Malformed name tag", "tag", tag, "component", component) +} + +func parseNameTags(component string, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) { + lastTagEndIndex := 0 + for i, c := range component { + if c == ',' { + tag := component[lastTagEndIndex:i] + lastTagEndIndex = i + 1 + parseTag(component, tag, '=', labels, tagErrors, logger) + } + } + + // If we're not off the end of the string, add the last tag + if lastTagEndIndex < len(component) { + tag := component[lastTagEndIndex:] + parseTag(component, tag, '=', labels, tagErrors, logger) + } +} + +func trimLeftHash(s string) string { + if s != "" && s[0] == '#' { + return s[1:] + } + return s +} + +func parseDogStatsDTags(component string, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) { + lastTagEndIndex := 0 + for i, c := range component { + if c == ',' { + tag := component[lastTagEndIndex:i] + lastTagEndIndex = i + 1 + parseTag(component, trimLeftHash(tag), ':', labels, tagErrors, logger) + } + } + + // If we're not off the end of the string, add the last tag + if lastTagEndIndex < len(component) { + tag := component[lastTagEndIndex:] + parseTag(component, trimLeftHash(tag), ':', labels, tagErrors, logger) + } +} + +func parseNameAndTags(name string, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) string { + for i, c := range name { + // `#` delimits start of tags by Librato + // https://www.librato.com/docs/kb/collect/collection_agents/stastd/#stat-level-tags + // `,` delimits start of tags by InfluxDB + // https://www.influxdata.com/blog/getting-started-with-sending-statsd-metrics-to-telegraf-influxdb/#introducing-influx-statsd + if c == '#' || c == ',' { + parseNameTags(name[i+1:], labels, tagErrors, logger) + return name[:i] + } + } + return name +} + +func LineToEvents(line string, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter, logger log.Logger) event.Events { + events := event.Events{} + if line == "" { + return events + } + + elements := strings.SplitN(line, ":", 2) + if len(elements) < 2 || len(elements[0]) == 0 || !utf8.ValidString(line) { + sampleErrors.WithLabelValues("malformed_line").Inc() + level.Debug(logger).Log("msg", "Bad line from StatsD", "line", line) + return events + } + + labels := map[string]string{} + metric := parseNameAndTags(elements[0], labels, tagErrors, logger) + + var samples []string + if strings.Contains(elements[1], "|#") { + // using DogStatsD tags + + // don't allow mixed tagging styles + if len(labels) > 0 { + sampleErrors.WithLabelValues("mixed_tagging_styles").Inc() + level.Debug(logger).Log("msg", "Bad line (multiple tagging styles) from StatsD", "line", line) + return events + } + + // disable multi-metrics + samples = elements[1:] + } else { + samples = strings.Split(elements[1], ":") + } + +samples: + for _, sample := range samples { + samplesReceived.Inc() + components := strings.Split(sample, "|") + samplingFactor := 1.0 + if len(components) < 2 || len(components) > 4 { + sampleErrors.WithLabelValues("malformed_component").Inc() + level.Debug(logger).Log("msg", "Bad component", "line", line) + continue + } + valueStr, statType := components[0], components[1] + + var relative = false + if strings.Index(valueStr, "+") == 0 || strings.Index(valueStr, "-") == 0 { + relative = true + } + + value, err := strconv.ParseFloat(valueStr, 64) + if err != nil { + level.Debug(logger).Log("msg", "Bad value", "value", valueStr, "line", line) + sampleErrors.WithLabelValues("malformed_value").Inc() + continue + } + + multiplyEvents := 1 + if len(components) >= 3 { + for _, component := range components[2:] { + if len(component) == 0 { + level.Debug(logger).Log("msg", "Empty component", "line", line) + sampleErrors.WithLabelValues("malformed_component").Inc() + continue samples + } + } + + for _, component := range components[2:] { + switch component[0] { + case '@': + + samplingFactor, err = strconv.ParseFloat(component[1:], 64) + if err != nil { + level.Debug(logger).Log("msg", "Invalid sampling factor", "component", component[1:], "line", line) + sampleErrors.WithLabelValues("invalid_sample_factor").Inc() + } + if samplingFactor == 0 { + samplingFactor = 1 + } + + if statType == "g" { + continue + } else if statType == "c" { + value /= samplingFactor + } else if statType == "ms" || statType == "h" || statType == "d" { + multiplyEvents = int(1 / samplingFactor) + } + case '#': + parseDogStatsDTags(component[1:], labels, tagErrors, logger) + default: + level.Debug(logger).Log("msg", "Invalid sampling factor or tag section", "component", components[2], "line", line) + sampleErrors.WithLabelValues("invalid_sample_factor").Inc() + continue + } + } + } + + if len(labels) > 0 { + tagsReceived.Inc() + } + + for i := 0; i < multiplyEvents; i++ { + event, err := buildEvent(statType, metric, value, relative, labels) + if err != nil { + level.Debug(logger).Log("msg", "Error building event", "line", line, "error", err) + sampleErrors.WithLabelValues("illegal_event").Inc() + continue + } + events = append(events, event) + } + } + return events +} diff --git a/pkg/listener/listener.go b/pkg/listener/listener.go new file mode 100644 index 0000000..5261bd2 --- /dev/null +++ b/pkg/listener/listener.go @@ -0,0 +1,138 @@ +package listener + +import ( + "bufio" + "io" + "net" + "os" + "strings" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/event" + pkgLine "github.com/prometheus/statsd_exporter/pkg/line" +) + +type StatsDUDPListener struct { + Conn *net.UDPConn + EventHandler event.EventHandler + Logger log.Logger +} + +func (l *StatsDUDPListener) SetEventHandler(eh event.EventHandler) { + l.EventHandler = eh +} + +func (l *StatsDUDPListener) Listen(udpPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + buf := make([]byte, 65535) + for { + n, _, err := l.Conn.ReadFromUDP(buf) + if err != nil { + // https://github.com/golang/go/issues/4373 + // ignore net: errClosing error as it will occur during shutdown + if strings.HasSuffix(err.Error(), "use of closed network connection") { + return + } + level.Error(l.Logger).Log("error", err) + return + } + l.HandlePacket(buf[0:n], udpPackets, linesReceived, eventsFlushed, sampleErrors, samplesReceived, tagErrors, tagsReceived) + } +} + +func (l *StatsDUDPListener) HandlePacket(packet []byte, udpPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + udpPackets.Inc() + lines := strings.Split(string(packet), "\n") + for _, line := range lines { + linesReceived.Inc() + l.EventHandler.Queue(pkgLine.LineToEvents(line, sampleErrors, samplesReceived, tagErrors, tagsReceived, l.Logger), &eventsFlushed) + } +} + +type StatsDTCPListener struct { + Conn *net.TCPListener + EventHandler event.EventHandler + Logger log.Logger +} + +func (l *StatsDTCPListener) SetEventHandler(eh event.EventHandler) { + l.EventHandler = eh +} + +func (l *StatsDTCPListener) Listen(linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, tcpConnections prometheus.Counter, tcpErrors prometheus.Counter, tcpLineTooLong prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + for { + c, err := l.Conn.AcceptTCP() + if err != nil { + // https://github.com/golang/go/issues/4373 + // ignore net: errClosing error as it will occur during shutdown + if strings.HasSuffix(err.Error(), "use of closed network connection") { + return + } + level.Error(l.Logger).Log("msg", "AcceptTCP failed", "error", err) + os.Exit(1) + } + go l.HandleConn(c, linesReceived, eventsFlushed, tcpConnections, tcpErrors, tcpLineTooLong, sampleErrors, samplesReceived, tagErrors, tagsReceived) + } +} + +func (l *StatsDTCPListener) HandleConn(c *net.TCPConn, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, tcpConnections prometheus.Counter, tcpErrors prometheus.Counter, tcpLineTooLong prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + defer c.Close() + + tcpConnections.Inc() + + r := bufio.NewReader(c) + for { + line, isPrefix, err := r.ReadLine() + if err != nil { + if err != io.EOF { + tcpErrors.Inc() + level.Debug(l.Logger).Log("msg", "Read failed", "addr", c.RemoteAddr(), "error", err) + } + break + } + if isPrefix { + tcpLineTooLong.Inc() + level.Debug(l.Logger).Log("msg", "Read failed: line too long", "addr", c.RemoteAddr()) + break + } + linesReceived.Inc() + l.EventHandler.Queue(pkgLine.LineToEvents(string(line), sampleErrors, samplesReceived, tagErrors, tagsReceived, l.Logger), &eventsFlushed) + } +} + +type StatsDUnixgramListener struct { + Conn *net.UnixConn + EventHandler event.EventHandler + Logger log.Logger +} + +func (l *StatsDUnixgramListener) SetEventHandler(eh event.EventHandler) { + l.EventHandler = eh +} + +func (l *StatsDUnixgramListener) Listen(unixgramPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + buf := make([]byte, 65535) + for { + n, _, err := l.Conn.ReadFromUnix(buf) + if err != nil { + // https://github.com/golang/go/issues/4373 + // ignore net: errClosing error as it will occur during shutdown + if strings.HasSuffix(err.Error(), "use of closed network connection") { + return + } + level.Error(l.Logger).Log(err) + os.Exit(1) + } + l.HandlePacket(buf[:n], unixgramPackets, linesReceived, eventsFlushed, sampleErrors, samplesReceived, tagErrors, tagsReceived) + } +} + +func (l *StatsDUnixgramListener) HandlePacket(packet []byte, unixgramPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + unixgramPackets.Inc() + lines := strings.Split(string(packet), "\n") + for _, line := range lines { + linesReceived.Inc() + l.EventHandler.Queue(pkgLine.LineToEvents(line, sampleErrors, samplesReceived, tagErrors, tagsReceived, l.Logger), &eventsFlushed) + } +} diff --git a/pkg/listener/listener.go~ b/pkg/listener/listener.go~ new file mode 100644 index 0000000..de8e968 --- /dev/null +++ b/pkg/listener/listener.go~ @@ -0,0 +1,138 @@ +package listener + +import ( + "bufio" + "io" + "net" + "os" + "strings" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/event" + pkgLine "github.com/prometheus/statsd_exporter/pkg/line" +) + +type StatsDUDPListener struct { + Conn *net.UDPConn + EventHandler event.EventHandler + Logger log.Logger +} + +func (l *StatsDUDPListener) SetEventHandler(eh event.EventHandler) { + l.EventHandler = eh +} + +func (l *StatsDUDPListener) Listen(udpPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + buf := make([]byte, 65535) + for { + n, _, err := l.Conn.ReadFromUDP(buf) + if err != nil { + // https://github.com/golang/go/issues/4373 + // ignore net: errClosing error as it will occur during shutdown + if strings.HasSuffix(err.Error(), "use of closed network connection") { + return + } + level.Error(l.Logger).Log("error", err) + return + } + l.handlePacket(buf[0:n], udpPackets, linesReceived, eventsFlushed, sampleErrors, samplesReceived, tagErrors, tagsReceived) + } +} + +func (l *StatsDUDPListener) handlePacket(packet []byte, udpPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + udpPackets.Inc() + lines := strings.Split(string(packet), "\n") + for _, line := range lines { + linesReceived.Inc() + l.EventHandler.Queue(pkgLine.LineToEvents(line, sampleErrors, samplesReceived, tagErrors, tagsReceived, l.Logger), &eventsFlushed) + } +} + +type StatsDTCPListener struct { + Conn *net.TCPListener + EventHandler event.EventHandler + Logger log.Logger +} + +func (l *StatsDTCPListener) SetEventHandler(eh event.EventHandler) { + l.EventHandler = eh +} + +func (l *StatsDTCPListener) Listen(linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, tcpConnections prometheus.Counter, tcpErrors prometheus.Counter, tcpLineTooLong prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + for { + c, err := l.Conn.AcceptTCP() + if err != nil { + // https://github.com/golang/go/issues/4373 + // ignore net: errClosing error as it will occur during shutdown + if strings.HasSuffix(err.Error(), "use of closed network connection") { + return + } + level.Error(l.Logger).Log("msg", "AcceptTCP failed", "error", err) + os.Exit(1) + } + go l.handleConn(c, linesReceived, eventsFlushed, tcpConnections, tcpErrors, tcpLineTooLong, sampleErrors, samplesReceived, tagErrors, tagsReceived) + } +} + +func (l *StatsDTCPListener) handleConn(c *net.TCPConn, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, tcpConnections prometheus.Counter, tcpErrors prometheus.Counter, tcpLineTooLong prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + defer c.Close() + + tcpConnections.Inc() + + r := bufio.NewReader(c) + for { + line, isPrefix, err := r.ReadLine() + if err != nil { + if err != io.EOF { + tcpErrors.Inc() + level.Debug(l.Logger).Log("msg", "Read failed", "addr", c.RemoteAddr(), "error", err) + } + break + } + if isPrefix { + tcpLineTooLong.Inc() + level.Debug(l.Logger).Log("msg", "Read failed: line too long", "addr", c.RemoteAddr()) + break + } + linesReceived.Inc() + l.EventHandler.Queue(pkgLine.LineToEvents(string(line), sampleErrors, samplesReceived, tagErrors, tagsReceived, l.Logger), &eventsFlushed) + } +} + +type StatsDUnixgramListener struct { + Conn *net.UnixConn + EventHandler event.EventHandler + Logger log.Logger +} + +func (l *StatsDUnixgramListener) SetEventHandler(eh event.EventHandler) { + l.EventHandler = eh +} + +func (l *StatsDUnixgramListener) Listen(unixgramPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + buf := make([]byte, 65535) + for { + n, _, err := l.Conn.ReadFromUnix(buf) + if err != nil { + // https://github.com/golang/go/issues/4373 + // ignore net: errClosing error as it will occur during shutdown + if strings.HasSuffix(err.Error(), "use of closed network connection") { + return + } + level.Error(l.Logger).Log(err) + os.Exit(1) + } + l.handlePacket(buf[:n], unixgramPackets, linesReceived, eventsFlushed, sampleErrors, samplesReceived, tagErrors, tagsReceived) + } +} + +func (l *StatsDUnixgramListener) handlePacket(packet []byte, unixgramPackets prometheus.Counter, linesReceived prometheus.Counter, eventsFlushed prometheus.Counter, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter) { + unixgramPackets.Inc() + lines := strings.Split(string(packet), "\n") + for _, line := range lines { + linesReceived.Inc() + l.EventHandler.Queue(pkgLine.LineToEvents(line, sampleErrors, samplesReceived, tagErrors, tagsReceived, l.Logger), &eventsFlushed) + } +} diff --git a/pkg/mapper/action.go b/pkg/mapper/action.go index b8c0977..e0773f0 100644 --- a/pkg/mapper/action.go +++ b/pkg/mapper/action.go @@ -1,42 +1,42 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import "fmt" - -type ActionType string - -const ( - ActionTypeMap ActionType = "map" - ActionTypeDrop ActionType = "drop" - ActionTypeDefault ActionType = "" -) - -func (t *ActionType) UnmarshalYAML(unmarshal func(interface{}) error) error { - var v string - - if err := unmarshal(&v); err != nil { - return err - } - - switch ActionType(v) { - case ActionTypeDrop: - *t = ActionTypeDrop - case ActionTypeMap, ActionTypeDefault: - *t = ActionTypeMap - default: - return fmt.Errorf("invalid action type %q", v) - } - return nil -} +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import "fmt" + +type ActionType string + +const ( + ActionTypeMap ActionType = "map" + ActionTypeDrop ActionType = "drop" + ActionTypeDefault ActionType = "" +) + +func (t *ActionType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var v string + + if err := unmarshal(&v); err != nil { + return err + } + + switch ActionType(v) { + case ActionTypeDrop: + *t = ActionTypeDrop + case ActionTypeMap, ActionTypeDefault: + *t = ActionTypeMap + default: + return fmt.Errorf("invalid action type %q", v) + } + return nil +} diff --git a/pkg/mapper/escape.go b/pkg/mapper/escape.go index fc8d194..4b27cdd 100644 --- a/pkg/mapper/escape.go +++ b/pkg/mapper/escape.go @@ -1,74 +1,74 @@ -// Copyright 2020 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import ( - "strings" - "unicode/utf8" -) - -// EscapeMetricName replaces invalid characters in the metric name with "_" -// Valid characters are a-z, A-Z, 0-9, and _ -func EscapeMetricName(metricName string) string { - metricLen := len(metricName) - if metricLen == 0 { - return "" - } - - escaped := false - var sb strings.Builder - // If a metric starts with a digit, allocate the memory and prepend an - // underscore. - if metricName[0] >= '0' && metricName[0] <= '9' { - escaped = true - sb.Grow(metricLen + 1) - sb.WriteByte('_') - } - - // This is an character replacement method optimized for this limited - // use case. It is much faster than using a regex. - offset := 0 - for i, c := range metricName { - // Seek forward, skipping valid characters until we find one that needs - // to be replaced, then add all the characters we've seen so far to the - // string.Builder. - if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || (c == '_') { - // Character is valid, so skip over it without doing anything. - } else { - if !escaped { - // Up until now we've been lazy and avoided actually allocating - // memory. Unfortunately we've now determined this string needs - // escaping, so allocate the buffer for the whole string. - escaped = true - sb.Grow(metricLen) - } - sb.WriteString(metricName[offset:i]) - offset = i + utf8.RuneLen(c) - sb.WriteByte('_') - } - } - - if !escaped { - // This is the happy path where nothing had to be escaped, so we can - // avoid doing anything. - return metricName - } - - if offset < metricLen { - sb.WriteString(metricName[offset:]) - } - - return sb.String() -} +// Copyright 2020 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import ( + "strings" + "unicode/utf8" +) + +// EscapeMetricName replaces invalid characters in the metric name with "_" +// Valid characters are a-z, A-Z, 0-9, and _ +func EscapeMetricName(metricName string) string { + metricLen := len(metricName) + if metricLen == 0 { + return "" + } + + escaped := false + var sb strings.Builder + // If a metric starts with a digit, allocate the memory and prepend an + // underscore. + if metricName[0] >= '0' && metricName[0] <= '9' { + escaped = true + sb.Grow(metricLen + 1) + sb.WriteByte('_') + } + + // This is an character replacement method optimized for this limited + // use case. It is much faster than using a regex. + offset := 0 + for i, c := range metricName { + // Seek forward, skipping valid characters until we find one that needs + // to be replaced, then add all the characters we've seen so far to the + // string.Builder. + if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || (c == '_') { + // Character is valid, so skip over it without doing anything. + } else { + if !escaped { + // Up until now we've been lazy and avoided actually allocating + // memory. Unfortunately we've now determined this string needs + // escaping, so allocate the buffer for the whole string. + escaped = true + sb.Grow(metricLen) + } + sb.WriteString(metricName[offset:i]) + offset = i + utf8.RuneLen(c) + sb.WriteByte('_') + } + } + + if !escaped { + // This is the happy path where nothing had to be escaped, so we can + // avoid doing anything. + return metricName + } + + if offset < metricLen { + sb.WriteString(metricName[offset:]) + } + + return sb.String() +} diff --git a/pkg/mapper/escape_test.go b/pkg/mapper/escape_test.go index 336692d..d76cdc1 100644 --- a/pkg/mapper/escape_test.go +++ b/pkg/mapper/escape_test.go @@ -1,56 +1,56 @@ -// Copyright 2020 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import "testing" - -func TestEscapeMetricName(t *testing.T) { - scenarios := map[string]string{ - "clean": "clean", - "0starts_with_digit": "_0starts_with_digit", - "with_underscore": "with_underscore", - "with.dot": "with_dot", - "with😱emoji": "with_emoji", - "with.*.multiple": "with___multiple", - "test.web-server.foo.bar": "test_web_server_foo_bar", - "": "", - } - - for in, want := range scenarios { - if got := EscapeMetricName(in); want != got { - t.Errorf("expected `%s` to be escaped to `%s`, got `%s`", in, want, got) - } - } -} - -func BenchmarkEscapeMetricName(b *testing.B) { - scenarios := []string{ - "clean", - "0starts_with_digit", - "with_underscore", - "with.dot", - "with😱emoji", - "with.*.multiple", - "test.web-server.foo.bar", - "", - } - - for _, s := range scenarios { - b.Run(s, func(b *testing.B) { - for n := 0; n < b.N; n++ { - EscapeMetricName(s) - } - }) - } -} +// Copyright 2020 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import "testing" + +func TestEscapeMetricName(t *testing.T) { + scenarios := map[string]string{ + "clean": "clean", + "0starts_with_digit": "_0starts_with_digit", + "with_underscore": "with_underscore", + "with.dot": "with_dot", + "with😱emoji": "with_emoji", + "with.*.multiple": "with___multiple", + "test.web-server.foo.bar": "test_web_server_foo_bar", + "": "", + } + + for in, want := range scenarios { + if got := EscapeMetricName(in); want != got { + t.Errorf("expected `%s` to be escaped to `%s`, got `%s`", in, want, got) + } + } +} + +func BenchmarkEscapeMetricName(b *testing.B) { + scenarios := []string{ + "clean", + "0starts_with_digit", + "with_underscore", + "with.dot", + "with😱emoji", + "with.*.multiple", + "test.web-server.foo.bar", + "", + } + + for _, s := range scenarios { + b.Run(s, func(b *testing.B) { + for n := 0; n < b.N; n++ { + EscapeMetricName(s) + } + }) + } +} diff --git a/pkg/mapper/fsm/README.md b/pkg/mapper/fsm/README.md index 722ee21..c078240 100644 --- a/pkg/mapper/fsm/README.md +++ b/pkg/mapper/fsm/README.md @@ -1,132 +1,132 @@ -# FSM Mapping - -## Overview - -This package implements a fast and efficient algorithm for generic glob style -string matching using a finite state machine (FSM). - -### Source Hierachy - -``` - '-- fsm - '-- dump.go // functionality to dump the FSM to Dot file - '-- formatter.go // format glob templates using captured * groups - '-- fsm.go // manipulating and searching of FSM - '-- minmax.go // min() max() function for interger -``` - -## FSM Explained - -Per [Wikipedia](https://en.wikipedia.org/wiki/Finite-state_machine): - -> A finite-state machine (FSM) or finite-state automaton (FSA, plural: automata), -> finite automaton, or simply a state machine, is a mathematical model of -> computation. It is an abstract machine that can be in exactly one of a finite -> number of states at any given time. The FSM can change from one state to -> another in response to some external inputs; the change from one state to -> another is called a transition. An FSM is defined by a list of its states, its -> initial state, and the conditions for each transition. - -In our use case, each *state* is a substring after the input StatsD metric name is splitted by `.`. - -### Add state to FSM - -`func (f *FSM) AddState(match string, matchMetricType string, -maxPossibleTransitions int, result interface{}) int` - -At first, the FSM only contains three states, representing three possible metric types: - - ____ [gauge] - / - (start)---- [counter] - \ - '--- [ timer ] - - -Adding a rule `client.*.request.count` with type `counter` will make the FSM to be: - - - ____ [gauge] - / - (start)---- [counter] -- [client] -- [*] -- [request] -- [count] -- {R1} - \ - '--- [timer] - -`{R1}` is short for result 1, which is the match result for `client.*.request.count`. - -Adding a rule `client.*.*.size` with type `counter` will make the FSM to be: - - ____ [gauge] __ [request] -- [count] -- {R1} - / / - (start)---- [counter] -- [client] -- [*] - \ \__ [*] -- [size] -- {R2} - '--- [timer] - - -### Finding a result state in FSM - -`func (f *FSM) GetMapping(statsdMetric string, statsdMetricType string) -(*mappingState, []string)` - -For example, when mapping `client.aaa.request.count` with `counter` type in the -FSM, the `^1` to `^7` symbols indicate how FSM will traversal in its tree: - - - ____ [gauge] __ [request] -- [count] -- {R1} - / / ^5 ^6 ^7 - (start)---- [counter] -- [client] -- [*] - ^1 \ ^2 ^3 \__ [*] -- [size] -- {R2} - '--- [timer] ^4 - - -To map `client.bbb.request.size`, FSM will do a backtracking: - - - ____ [gauge] __ [request] -- [count] -- {R1} - / / ^5 ^6 - (start)---- [counter] -- [client] -- [*] - ^1 \ ^2 ^3 \__ [*] -- [size] -- {R2} - '--- [timer] ^4 - ^7 ^8 ^9 - - -## Debugging - -To see all the states of the current FSM, use `func (f *FSM) DumpFSM(w io.Writer)` -to dump into a Dot file. The Dot file can be further renderer into image using: - -```shell -$ dot -Tpng dump.dot > dump.png -``` - -In StatsD exporter, one could use the following: - -```shell -$ statsd_exporter --statsd.mapping-config=statsd.rules --debug.dump-fsm=dump.dot -$ dot -Tpng dump.dot > dump.png -``` - -For example, the following rules: - -```yaml -mappings: -- match: client.*.request.count - name: request_count - match_metric_type: counter - labels: - client: $1 - -- match: client.*.*.size - name: sizes - match_metric_type: counter - labels: - client: $1 - direction: $2 -``` - -will be rendered as: - -![FSM](fsm.png) - -The `dot` program is part of [Graphviz](https://www.graphviz.org/) and is -available in most of popular operating systems. +# FSM Mapping + +## Overview + +This package implements a fast and efficient algorithm for generic glob style +string matching using a finite state machine (FSM). + +### Source Hierachy + +``` + '-- fsm + '-- dump.go // functionality to dump the FSM to Dot file + '-- formatter.go // format glob templates using captured * groups + '-- fsm.go // manipulating and searching of FSM + '-- minmax.go // min() max() function for interger +``` + +## FSM Explained + +Per [Wikipedia](https://en.wikipedia.org/wiki/Finite-state_machine): + +> A finite-state machine (FSM) or finite-state automaton (FSA, plural: automata), +> finite automaton, or simply a state machine, is a mathematical model of +> computation. It is an abstract machine that can be in exactly one of a finite +> number of states at any given time. The FSM can change from one state to +> another in response to some external inputs; the change from one state to +> another is called a transition. An FSM is defined by a list of its states, its +> initial state, and the conditions for each transition. + +In our use case, each *state* is a substring after the input StatsD metric name is splitted by `.`. + +### Add state to FSM + +`func (f *FSM) AddState(match string, matchMetricType string, +maxPossibleTransitions int, result interface{}) int` + +At first, the FSM only contains three states, representing three possible metric types: + + ____ [gauge] + / + (start)---- [counter] + \ + '--- [ timer ] + + +Adding a rule `client.*.request.count` with type `counter` will make the FSM to be: + + + ____ [gauge] + / + (start)---- [counter] -- [client] -- [*] -- [request] -- [count] -- {R1} + \ + '--- [timer] + +`{R1}` is short for result 1, which is the match result for `client.*.request.count`. + +Adding a rule `client.*.*.size` with type `counter` will make the FSM to be: + + ____ [gauge] __ [request] -- [count] -- {R1} + / / + (start)---- [counter] -- [client] -- [*] + \ \__ [*] -- [size] -- {R2} + '--- [timer] + + +### Finding a result state in FSM + +`func (f *FSM) GetMapping(statsdMetric string, statsdMetricType string) +(*mappingState, []string)` + +For example, when mapping `client.aaa.request.count` with `counter` type in the +FSM, the `^1` to `^7` symbols indicate how FSM will traversal in its tree: + + + ____ [gauge] __ [request] -- [count] -- {R1} + / / ^5 ^6 ^7 + (start)---- [counter] -- [client] -- [*] + ^1 \ ^2 ^3 \__ [*] -- [size] -- {R2} + '--- [timer] ^4 + + +To map `client.bbb.request.size`, FSM will do a backtracking: + + + ____ [gauge] __ [request] -- [count] -- {R1} + / / ^5 ^6 + (start)---- [counter] -- [client] -- [*] + ^1 \ ^2 ^3 \__ [*] -- [size] -- {R2} + '--- [timer] ^4 + ^7 ^8 ^9 + + +## Debugging + +To see all the states of the current FSM, use `func (f *FSM) DumpFSM(w io.Writer)` +to dump into a Dot file. The Dot file can be further renderer into image using: + +```shell +$ dot -Tpng dump.dot > dump.png +``` + +In StatsD exporter, one could use the following: + +```shell +$ statsd_exporter --statsd.mapping-config=statsd.rules --debug.dump-fsm=dump.dot +$ dot -Tpng dump.dot > dump.png +``` + +For example, the following rules: + +```yaml +mappings: +- match: client.*.request.count + name: request_count + match_metric_type: counter + labels: + client: $1 + +- match: client.*.*.size + name: sizes + match_metric_type: counter + labels: + client: $1 + direction: $2 +``` + +will be rendered as: + +![FSM](fsm.png) + +The `dot` program is part of [Graphviz](https://www.graphviz.org/) and is +available in most of popular operating systems. diff --git a/pkg/mapper/fsm/dump.go b/pkg/mapper/fsm/dump.go index d91e2cf..0725d60 100644 --- a/pkg/mapper/fsm/dump.go +++ b/pkg/mapper/fsm/dump.go @@ -1,48 +1,48 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fsm - -import ( - "fmt" - "io" -) - -// DumpFSM accepts a io.writer and write the current FSM into dot file format. -func (f *FSM) DumpFSM(w io.Writer) { - idx := 0 - states := make(map[int]*mappingState) - states[idx] = f.root - - w.Write([]byte("digraph g {\n")) - w.Write([]byte("rankdir=LR\n")) // make it vertical - w.Write([]byte("node [ label=\"\",style=filled,fillcolor=white,shape=circle ]\n")) // remove label of node - - for idx < len(states) { - for field, transition := range states[idx].transitions { - states[len(states)] = transition - w.Write([]byte(fmt.Sprintf("%d -> %d [label = \"%s\"];\n", idx, len(states)-1, field))) - if idx == 0 { - // color for metric types - w.Write([]byte(fmt.Sprintf("%d [color=\"#D6B656\",fillcolor=\"#FFF2CC\"];\n", len(states)-1))) - } else if transition.transitions == nil || len(transition.transitions) == 0 { - // color for end state - w.Write([]byte(fmt.Sprintf("%d [color=\"#82B366\",fillcolor=\"#D5E8D4\"];\n", len(states)-1))) - } - } - idx++ - } - // color for start state - w.Write([]byte(fmt.Sprintf("0 [color=\"#a94442\",fillcolor=\"#f2dede\"];\n"))) - w.Write([]byte("}")) -} +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fsm + +import ( + "fmt" + "io" +) + +// DumpFSM accepts a io.writer and write the current FSM into dot file format. +func (f *FSM) DumpFSM(w io.Writer) { + idx := 0 + states := make(map[int]*mappingState) + states[idx] = f.root + + w.Write([]byte("digraph g {\n")) + w.Write([]byte("rankdir=LR\n")) // make it vertical + w.Write([]byte("node [ label=\"\",style=filled,fillcolor=white,shape=circle ]\n")) // remove label of node + + for idx < len(states) { + for field, transition := range states[idx].transitions { + states[len(states)] = transition + w.Write([]byte(fmt.Sprintf("%d -> %d [label = \"%s\"];\n", idx, len(states)-1, field))) + if idx == 0 { + // color for metric types + w.Write([]byte(fmt.Sprintf("%d [color=\"#D6B656\",fillcolor=\"#FFF2CC\"];\n", len(states)-1))) + } else if transition.transitions == nil || len(transition.transitions) == 0 { + // color for end state + w.Write([]byte(fmt.Sprintf("%d [color=\"#82B366\",fillcolor=\"#D5E8D4\"];\n", len(states)-1))) + } + } + idx++ + } + // color for start state + w.Write([]byte(fmt.Sprintf("0 [color=\"#a94442\",fillcolor=\"#f2dede\"];\n"))) + w.Write([]byte("}")) +} diff --git a/pkg/mapper/fsm/formatter.go b/pkg/mapper/fsm/formatter.go index 567bbc2..3864443 100644 --- a/pkg/mapper/fsm/formatter.go +++ b/pkg/mapper/fsm/formatter.go @@ -1,76 +1,76 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fsm - -import ( - "fmt" - "regexp" - "strconv" - "strings" -) - -var ( - templateReplaceCaptureRE = regexp.MustCompile(`\$\{?([a-zA-Z0-9_\$]+)\}?`) -) - -type TemplateFormatter struct { - captureIndexes []int - captureCount int - fmtString string -} - -// NewTemplateFormatter instantiates a TemplateFormatter -// from given template string and the maximum amount of captures. -func NewTemplateFormatter(template string, captureCount int) *TemplateFormatter { - matches := templateReplaceCaptureRE.FindAllStringSubmatch(template, -1) - if len(matches) == 0 { - // if no regex reference found, keep it as it is - return &TemplateFormatter{captureCount: 0, fmtString: template} - } - - var indexes []int - valueFormatter := template - for _, match := range matches { - idx, err := strconv.Atoi(match[len(match)-1]) - if err != nil || idx > captureCount || idx < 1 { - // if index larger than captured count or using unsupported named capture group, - // replace with empty string - valueFormatter = strings.Replace(valueFormatter, match[0], "", -1) - } else { - valueFormatter = strings.Replace(valueFormatter, match[0], "%s", -1) - // note: the regex reference variable $? starts from 1 - indexes = append(indexes, idx-1) - } - } - return &TemplateFormatter{ - captureIndexes: indexes, - captureCount: len(indexes), - fmtString: valueFormatter, - } -} - -// Format accepts a list containing captured strings and returns the formatted -// string using the template stored in current TemplateFormatter. -func (formatter *TemplateFormatter) Format(captures []string) string { - if formatter.captureCount == 0 { - // no label substitution, keep as it is - return formatter.fmtString - } - indexes := formatter.captureIndexes - vargs := make([]interface{}, formatter.captureCount) - for i, idx := range indexes { - vargs[i] = captures[idx] - } - return fmt.Sprintf(formatter.fmtString, vargs...) -} +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fsm + +import ( + "fmt" + "regexp" + "strconv" + "strings" +) + +var ( + templateReplaceCaptureRE = regexp.MustCompile(`\$\{?([a-zA-Z0-9_\$]+)\}?`) +) + +type TemplateFormatter struct { + captureIndexes []int + captureCount int + fmtString string +} + +// NewTemplateFormatter instantiates a TemplateFormatter +// from given template string and the maximum amount of captures. +func NewTemplateFormatter(template string, captureCount int) *TemplateFormatter { + matches := templateReplaceCaptureRE.FindAllStringSubmatch(template, -1) + if len(matches) == 0 { + // if no regex reference found, keep it as it is + return &TemplateFormatter{captureCount: 0, fmtString: template} + } + + var indexes []int + valueFormatter := template + for _, match := range matches { + idx, err := strconv.Atoi(match[len(match)-1]) + if err != nil || idx > captureCount || idx < 1 { + // if index larger than captured count or using unsupported named capture group, + // replace with empty string + valueFormatter = strings.Replace(valueFormatter, match[0], "", -1) + } else { + valueFormatter = strings.Replace(valueFormatter, match[0], "%s", -1) + // note: the regex reference variable $? starts from 1 + indexes = append(indexes, idx-1) + } + } + return &TemplateFormatter{ + captureIndexes: indexes, + captureCount: len(indexes), + fmtString: valueFormatter, + } +} + +// Format accepts a list containing captured strings and returns the formatted +// string using the template stored in current TemplateFormatter. +func (formatter *TemplateFormatter) Format(captures []string) string { + if formatter.captureCount == 0 { + // no label substitution, keep as it is + return formatter.fmtString + } + indexes := formatter.captureIndexes + vargs := make([]interface{}, formatter.captureCount) + for i, idx := range indexes { + vargs[i] = captures[idx] + } + return fmt.Sprintf(formatter.fmtString, vargs...) +} diff --git a/pkg/mapper/fsm/fsm.go b/pkg/mapper/fsm/fsm.go index cf8c00e..a57f9a2 100644 --- a/pkg/mapper/fsm/fsm.go +++ b/pkg/mapper/fsm/fsm.go @@ -1,326 +1,326 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fsm - -import ( - "regexp" - "strings" - - "github.com/prometheus/common/log" -) - -type mappingState struct { - transitions map[string]*mappingState - minRemainingLength int - maxRemainingLength int - // result* members are nil unless there's a metric ends with this state - Result interface{} - ResultPriority int -} - -type fsmBacktrackStackCursor struct { - fieldIndex int - captureIndex int - currentCapture string - state *mappingState - prev *fsmBacktrackStackCursor - next *fsmBacktrackStackCursor -} - -type FSM struct { - root *mappingState - metricTypes []string - statesCount int - BacktrackingNeeded bool - OrderingDisabled bool -} - -// NewFSM creates a new FSM instance -func NewFSM(metricTypes []string, maxPossibleTransitions int, orderingDisabled bool) *FSM { - fsm := FSM{} - root := &mappingState{} - root.transitions = make(map[string]*mappingState, len(metricTypes)) - - for _, field := range metricTypes { - state := &mappingState{} - (*state).transitions = make(map[string]*mappingState, maxPossibleTransitions) - root.transitions[string(field)] = state - } - fsm.OrderingDisabled = orderingDisabled - fsm.metricTypes = metricTypes - fsm.statesCount = 0 - fsm.root = root - return &fsm -} - -// AddState adds a mapping rule into the existing FSM. -// The maxPossibleTransitions parameter sets the expected count of transitions left. -// The result parameter sets the generic type to be returned when fsm found a match in GetMapping. -func (f *FSM) AddState(match string, matchMetricType string, maxPossibleTransitions int, result interface{}) int { - // first split by "." - matchFields := strings.Split(match, ".") - // fill into our FSM - roots := []*mappingState{} - // first state is the metric type - if matchMetricType == "" { - // if metricType not specified, connect the start state from all three types - for _, metricType := range f.metricTypes { - roots = append(roots, f.root.transitions[string(metricType)]) - } - } else { - roots = append(roots, f.root.transitions[matchMetricType]) - } - var captureCount int - var finalStates []*mappingState - // iterating over different start state (different metric types) - for _, root := range roots { - captureCount = 0 - // for each start state, connect from start state to end state - for i, field := range matchFields { - state, prs := root.transitions[field] - if !prs { - // create a state if it's not exist in the fsm - state = &mappingState{} - (*state).transitions = make(map[string]*mappingState, maxPossibleTransitions) - (*state).maxRemainingLength = len(matchFields) - i - 1 - (*state).minRemainingLength = len(matchFields) - i - 1 - root.transitions[field] = state - // if this is last field, set result to currentMapping instance - if i == len(matchFields)-1 { - root.transitions[field].Result = result - } - } else { - (*state).maxRemainingLength = max(len(matchFields)-i-1, (*state).maxRemainingLength) - (*state).minRemainingLength = min(len(matchFields)-i-1, (*state).minRemainingLength) - } - if field == "*" { - captureCount++ - } - - // goto next state - root = state - } - finalStates = append(finalStates, root) - } - - for _, state := range finalStates { - state.ResultPriority = f.statesCount - } - - f.statesCount++ - - return captureCount -} - -// GetMapping using the fsm to find matching rules according to given statsdMetric and statsdMetricType. -// If it finds a match, the final state and the captured strings are returned; -// if there's no match found, nil and a empty list will be returned. -func (f *FSM) GetMapping(statsdMetric string, statsdMetricType string) (*mappingState, []string) { - matchFields := strings.Split(statsdMetric, ".") - currentState := f.root.transitions[statsdMetricType] - - // the cursor/pointer in the backtrack stack implemented as a double-linked list - var backtrackCursor *fsmBacktrackStackCursor - resumeFromBacktrack := false - - // the return variable - var finalState *mappingState - - captures := make([]string, len(matchFields)) - finalCaptures := make([]string, len(matchFields)) - // keep track of captured group so we don't need to do append() on captures - captureIdx := 0 - filedsCount := len(matchFields) - i := 0 - var state *mappingState - for { // the loop for backtracking - for { // the loop for a single "depth only" search - var present bool - // if we resume from backtrack, we should skip this branch in this case - // since the state that were saved at the end of this branch - if !resumeFromBacktrack { - if len(currentState.transitions) > 0 { - field := matchFields[i] - state, present = currentState.transitions[field] - fieldsLeft := filedsCount - i - 1 - // also compare length upfront to avoid unnecessary loop or backtrack - if !present || fieldsLeft > state.maxRemainingLength || fieldsLeft < state.minRemainingLength { - state, present = currentState.transitions["*"] - if !present || fieldsLeft > state.maxRemainingLength || fieldsLeft < state.minRemainingLength { - break - } else { - captures[captureIdx] = field - captureIdx++ - } - } else if f.BacktrackingNeeded { - // if backtracking is needed, also check for alternative transition, i.e. * - altState, present := currentState.transitions["*"] - if !present || fieldsLeft > altState.maxRemainingLength || fieldsLeft < altState.minRemainingLength { - } else { - // push to backtracking stack - newCursor := fsmBacktrackStackCursor{prev: backtrackCursor, state: altState, - fieldIndex: i, - captureIndex: captureIdx, currentCapture: field, - } - // if this is not the first time, connect to the previous cursor - if backtrackCursor != nil { - backtrackCursor.next = &newCursor - } - backtrackCursor = &newCursor - } - } - } else { - // no more transitions for this state - break - } - } // backtrack will resume from here - - // do we reach a final state? - if state.Result != nil && i == filedsCount-1 { - if f.OrderingDisabled { - finalState = state - return finalState, captures - } else if finalState == nil || finalState.ResultPriority > state.ResultPriority { - // if we care about ordering, try to find a result with highest prioity - finalState = state - // do a deep copy to preserve current captures - copy(finalCaptures, captures) - } - break - } - - i++ - if i >= filedsCount { - break - } - - resumeFromBacktrack = false - currentState = state - } - if backtrackCursor == nil { - // if we are not doing backtracking or all path has been travesaled - break - } else { - // pop one from stack - state = backtrackCursor.state - currentState = state - i = backtrackCursor.fieldIndex - captureIdx = backtrackCursor.captureIndex + 1 - // put the * capture back - captures[captureIdx-1] = backtrackCursor.currentCapture - backtrackCursor = backtrackCursor.prev - if backtrackCursor != nil { - // deref for GC - backtrackCursor.next = nil - } - resumeFromBacktrack = true - } - } - return finalState, finalCaptures -} - -// TestIfNeedBacktracking tests if backtrack is needed for given list of mappings -// and whether ordering is disabled. -func TestIfNeedBacktracking(mappings []string, orderingDisabled bool) bool { - backtrackingNeeded := false - // A has * in rules, but there's other transisitions at the same state, - // this makes A the cause of backtracking - ruleByLength := make(map[int][]string) - ruleREByLength := make(map[int][]*regexp.Regexp) - - // first sort rules by length - for _, mapping := range mappings { - l := len(strings.Split(mapping, ".")) - ruleByLength[l] = append(ruleByLength[l], mapping) - - metricRe := strings.Replace(mapping, ".", "\\.", -1) - metricRe = strings.Replace(metricRe, "*", "([^.]*)", -1) - regex, err := regexp.Compile("^" + metricRe + "$") - if err != nil { - log.Warnf("invalid match %s. cannot compile regex in mapping: %v", mapping, err) - } - // put into array no matter there's error or not, we will skip later if regex is nil - ruleREByLength[l] = append(ruleREByLength[l], regex) - } - - for l, rules := range ruleByLength { - if len(rules) == 1 { - continue - } - rulesRE := ruleREByLength[l] - for i1, r1 := range rules { - currentRuleNeedBacktrack := false - re1 := rulesRE[i1] - if re1 == nil || !strings.Contains(r1, "*") { - continue - } - // if rule r1 is A.B.C.*.E.*, is there a rule r2 is A.B.C.D.x.x or A.B.C.*.E.F ? (x is any string or *) - // if such r2 exists, then to match r1 we will need backtracking - for index := 0; index < len(r1); index++ { - if r1[index] != '*' { - continue - } - // translate the substring of r1 from 0 to the index of current * into regex - // A.B.C.*.E.* will becomes ^A\.B\.C\. and ^A\.B\.C\.\*\.E\. - reStr := strings.Replace(r1[:index], ".", "\\.", -1) - reStr = strings.Replace(reStr, "*", "\\*", -1) - re := regexp.MustCompile("^" + reStr) - for i2, r2 := range rules { - if i2 == i1 { - continue - } - if len(re.FindStringSubmatchIndex(r2)) > 0 { - currentRuleNeedBacktrack = true - break - } - } - } - - for i2, r2 := range rules { - if i2 != i1 && len(re1.FindStringSubmatchIndex(r2)) > 0 { - // log if we care about ordering and the superset occurs before - if !orderingDisabled && i1 < i2 { - log.Warnf("match \"%s\" is a super set of match \"%s\" but in a lower order, "+ - "the first will never be matched", r1, r2) - } - currentRuleNeedBacktrack = false - } - } - for i2, re2 := range rulesRE { - if i2 == i1 || re2 == nil { - continue - } - // if r1 is a subset of other rule, we don't need backtrack - // because either we turned on ordering - // or we disabled ordering and can't match it even with backtrack - if len(re2.FindStringSubmatchIndex(r1)) > 0 { - currentRuleNeedBacktrack = false - } - } - - if currentRuleNeedBacktrack { - log.Warnf("backtracking required because of match \"%s\", "+ - "matching performance may be degraded", r1) - backtrackingNeeded = true - } - } - } - - // backtracking will always be needed if ordering of rules is not disabled - // since transistions are stored in (unordered) map - // note: don't move this branch to the beginning of this function - // since we need logs for superset rules - - return !orderingDisabled || backtrackingNeeded -} +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fsm + +import ( + "regexp" + "strings" + + "github.com/prometheus/common/log" +) + +type mappingState struct { + transitions map[string]*mappingState + minRemainingLength int + maxRemainingLength int + // result* members are nil unless there's a metric ends with this state + Result interface{} + ResultPriority int +} + +type fsmBacktrackStackCursor struct { + fieldIndex int + captureIndex int + currentCapture string + state *mappingState + prev *fsmBacktrackStackCursor + next *fsmBacktrackStackCursor +} + +type FSM struct { + root *mappingState + metricTypes []string + statesCount int + BacktrackingNeeded bool + OrderingDisabled bool +} + +// NewFSM creates a new FSM instance +func NewFSM(metricTypes []string, maxPossibleTransitions int, orderingDisabled bool) *FSM { + fsm := FSM{} + root := &mappingState{} + root.transitions = make(map[string]*mappingState, len(metricTypes)) + + for _, field := range metricTypes { + state := &mappingState{} + (*state).transitions = make(map[string]*mappingState, maxPossibleTransitions) + root.transitions[string(field)] = state + } + fsm.OrderingDisabled = orderingDisabled + fsm.metricTypes = metricTypes + fsm.statesCount = 0 + fsm.root = root + return &fsm +} + +// AddState adds a mapping rule into the existing FSM. +// The maxPossibleTransitions parameter sets the expected count of transitions left. +// The result parameter sets the generic type to be returned when fsm found a match in GetMapping. +func (f *FSM) AddState(match string, matchMetricType string, maxPossibleTransitions int, result interface{}) int { + // first split by "." + matchFields := strings.Split(match, ".") + // fill into our FSM + roots := []*mappingState{} + // first state is the metric type + if matchMetricType == "" { + // if metricType not specified, connect the start state from all three types + for _, metricType := range f.metricTypes { + roots = append(roots, f.root.transitions[string(metricType)]) + } + } else { + roots = append(roots, f.root.transitions[matchMetricType]) + } + var captureCount int + var finalStates []*mappingState + // iterating over different start state (different metric types) + for _, root := range roots { + captureCount = 0 + // for each start state, connect from start state to end state + for i, field := range matchFields { + state, prs := root.transitions[field] + if !prs { + // create a state if it's not exist in the fsm + state = &mappingState{} + (*state).transitions = make(map[string]*mappingState, maxPossibleTransitions) + (*state).maxRemainingLength = len(matchFields) - i - 1 + (*state).minRemainingLength = len(matchFields) - i - 1 + root.transitions[field] = state + // if this is last field, set result to currentMapping instance + if i == len(matchFields)-1 { + root.transitions[field].Result = result + } + } else { + (*state).maxRemainingLength = max(len(matchFields)-i-1, (*state).maxRemainingLength) + (*state).minRemainingLength = min(len(matchFields)-i-1, (*state).minRemainingLength) + } + if field == "*" { + captureCount++ + } + + // goto next state + root = state + } + finalStates = append(finalStates, root) + } + + for _, state := range finalStates { + state.ResultPriority = f.statesCount + } + + f.statesCount++ + + return captureCount +} + +// GetMapping using the fsm to find matching rules according to given statsdMetric and statsdMetricType. +// If it finds a match, the final state and the captured strings are returned; +// if there's no match found, nil and a empty list will be returned. +func (f *FSM) GetMapping(statsdMetric string, statsdMetricType string) (*mappingState, []string) { + matchFields := strings.Split(statsdMetric, ".") + currentState := f.root.transitions[statsdMetricType] + + // the cursor/pointer in the backtrack stack implemented as a double-linked list + var backtrackCursor *fsmBacktrackStackCursor + resumeFromBacktrack := false + + // the return variable + var finalState *mappingState + + captures := make([]string, len(matchFields)) + finalCaptures := make([]string, len(matchFields)) + // keep track of captured group so we don't need to do append() on captures + captureIdx := 0 + filedsCount := len(matchFields) + i := 0 + var state *mappingState + for { // the loop for backtracking + for { // the loop for a single "depth only" search + var present bool + // if we resume from backtrack, we should skip this branch in this case + // since the state that were saved at the end of this branch + if !resumeFromBacktrack { + if len(currentState.transitions) > 0 { + field := matchFields[i] + state, present = currentState.transitions[field] + fieldsLeft := filedsCount - i - 1 + // also compare length upfront to avoid unnecessary loop or backtrack + if !present || fieldsLeft > state.maxRemainingLength || fieldsLeft < state.minRemainingLength { + state, present = currentState.transitions["*"] + if !present || fieldsLeft > state.maxRemainingLength || fieldsLeft < state.minRemainingLength { + break + } else { + captures[captureIdx] = field + captureIdx++ + } + } else if f.BacktrackingNeeded { + // if backtracking is needed, also check for alternative transition, i.e. * + altState, present := currentState.transitions["*"] + if !present || fieldsLeft > altState.maxRemainingLength || fieldsLeft < altState.minRemainingLength { + } else { + // push to backtracking stack + newCursor := fsmBacktrackStackCursor{prev: backtrackCursor, state: altState, + fieldIndex: i, + captureIndex: captureIdx, currentCapture: field, + } + // if this is not the first time, connect to the previous cursor + if backtrackCursor != nil { + backtrackCursor.next = &newCursor + } + backtrackCursor = &newCursor + } + } + } else { + // no more transitions for this state + break + } + } // backtrack will resume from here + + // do we reach a final state? + if state.Result != nil && i == filedsCount-1 { + if f.OrderingDisabled { + finalState = state + return finalState, captures + } else if finalState == nil || finalState.ResultPriority > state.ResultPriority { + // if we care about ordering, try to find a result with highest prioity + finalState = state + // do a deep copy to preserve current captures + copy(finalCaptures, captures) + } + break + } + + i++ + if i >= filedsCount { + break + } + + resumeFromBacktrack = false + currentState = state + } + if backtrackCursor == nil { + // if we are not doing backtracking or all path has been travesaled + break + } else { + // pop one from stack + state = backtrackCursor.state + currentState = state + i = backtrackCursor.fieldIndex + captureIdx = backtrackCursor.captureIndex + 1 + // put the * capture back + captures[captureIdx-1] = backtrackCursor.currentCapture + backtrackCursor = backtrackCursor.prev + if backtrackCursor != nil { + // deref for GC + backtrackCursor.next = nil + } + resumeFromBacktrack = true + } + } + return finalState, finalCaptures +} + +// TestIfNeedBacktracking tests if backtrack is needed for given list of mappings +// and whether ordering is disabled. +func TestIfNeedBacktracking(mappings []string, orderingDisabled bool) bool { + backtrackingNeeded := false + // A has * in rules, but there's other transisitions at the same state, + // this makes A the cause of backtracking + ruleByLength := make(map[int][]string) + ruleREByLength := make(map[int][]*regexp.Regexp) + + // first sort rules by length + for _, mapping := range mappings { + l := len(strings.Split(mapping, ".")) + ruleByLength[l] = append(ruleByLength[l], mapping) + + metricRe := strings.Replace(mapping, ".", "\\.", -1) + metricRe = strings.Replace(metricRe, "*", "([^.]*)", -1) + regex, err := regexp.Compile("^" + metricRe + "$") + if err != nil { + log.Warnf("invalid match %s. cannot compile regex in mapping: %v", mapping, err) + } + // put into array no matter there's error or not, we will skip later if regex is nil + ruleREByLength[l] = append(ruleREByLength[l], regex) + } + + for l, rules := range ruleByLength { + if len(rules) == 1 { + continue + } + rulesRE := ruleREByLength[l] + for i1, r1 := range rules { + currentRuleNeedBacktrack := false + re1 := rulesRE[i1] + if re1 == nil || !strings.Contains(r1, "*") { + continue + } + // if rule r1 is A.B.C.*.E.*, is there a rule r2 is A.B.C.D.x.x or A.B.C.*.E.F ? (x is any string or *) + // if such r2 exists, then to match r1 we will need backtracking + for index := 0; index < len(r1); index++ { + if r1[index] != '*' { + continue + } + // translate the substring of r1 from 0 to the index of current * into regex + // A.B.C.*.E.* will becomes ^A\.B\.C\. and ^A\.B\.C\.\*\.E\. + reStr := strings.Replace(r1[:index], ".", "\\.", -1) + reStr = strings.Replace(reStr, "*", "\\*", -1) + re := regexp.MustCompile("^" + reStr) + for i2, r2 := range rules { + if i2 == i1 { + continue + } + if len(re.FindStringSubmatchIndex(r2)) > 0 { + currentRuleNeedBacktrack = true + break + } + } + } + + for i2, r2 := range rules { + if i2 != i1 && len(re1.FindStringSubmatchIndex(r2)) > 0 { + // log if we care about ordering and the superset occurs before + if !orderingDisabled && i1 < i2 { + log.Warnf("match \"%s\" is a super set of match \"%s\" but in a lower order, "+ + "the first will never be matched", r1, r2) + } + currentRuleNeedBacktrack = false + } + } + for i2, re2 := range rulesRE { + if i2 == i1 || re2 == nil { + continue + } + // if r1 is a subset of other rule, we don't need backtrack + // because either we turned on ordering + // or we disabled ordering and can't match it even with backtrack + if len(re2.FindStringSubmatchIndex(r1)) > 0 { + currentRuleNeedBacktrack = false + } + } + + if currentRuleNeedBacktrack { + log.Warnf("backtracking required because of match \"%s\", "+ + "matching performance may be degraded", r1) + backtrackingNeeded = true + } + } + } + + // backtracking will always be needed if ordering of rules is not disabled + // since transistions are stored in (unordered) map + // note: don't move this branch to the beginning of this function + // since we need logs for superset rules + + return !orderingDisabled || backtrackingNeeded +} diff --git a/pkg/mapper/fsm/minmax.go b/pkg/mapper/fsm/minmax.go index 95bd9c5..c60695f 100644 --- a/pkg/mapper/fsm/minmax.go +++ b/pkg/mapper/fsm/minmax.go @@ -1,30 +1,30 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fsm - -// min and max implementation for integer - -func min(x, y int) int { - if x < y { - return x - } - return y -} - -func max(x, y int) int { - if x > y { - return x - } - return y -} +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fsm + +// min and max implementation for integer + +func min(x, y int) int { + if x < y { + return x + } + return y +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} diff --git a/pkg/mapper/mapper.go b/pkg/mapper/mapper.go index 8aac9d1..4f14573 100644 --- a/pkg/mapper/mapper.go +++ b/pkg/mapper/mapper.go @@ -1,386 +1,386 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import ( - "fmt" - "io/ioutil" - "regexp" - "sync" - "time" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" - "github.com/prometheus/statsd_exporter/pkg/mapper/fsm" - yaml "gopkg.in/yaml.v2" -) - -var ( - statsdMetricRE = `[a-zA-Z_](-?[a-zA-Z0-9_])+` - templateReplaceRE = `(\$\{?\d+\}?)` - - metricLineRE = regexp.MustCompile(`^(\*\.|` + statsdMetricRE + `\.)+(\*|` + statsdMetricRE + `)$`) - metricNameRE = regexp.MustCompile(`^([a-zA-Z_]|` + templateReplaceRE + `)([a-zA-Z0-9_]|` + templateReplaceRE + `)*$`) - labelNameRE = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_]+$`) -) - -type mapperConfigDefaults struct { - TimerType TimerType `yaml:"timer_type"` - Buckets []float64 `yaml:"buckets"` - Quantiles []metricObjective `yaml:"quantiles"` - MatchType MatchType `yaml:"match_type"` - GlobDisableOrdering bool `yaml:"glob_disable_ordering"` - Ttl time.Duration `yaml:"ttl"` -} - -type MetricMapper struct { - Defaults mapperConfigDefaults `yaml:"defaults"` - Mappings []MetricMapping `yaml:"mappings"` - FSM *fsm.FSM - doFSM bool - doRegex bool - cache MetricMapperCache - mutex sync.RWMutex - - MappingsCount prometheus.Gauge -} - -type MetricMapping struct { - Match string `yaml:"match"` - Name string `yaml:"name"` - nameFormatter *fsm.TemplateFormatter - regex *regexp.Regexp - Labels prometheus.Labels `yaml:"labels"` - labelKeys []string - labelFormatters []*fsm.TemplateFormatter - TimerType TimerType `yaml:"timer_type"` - LegacyBuckets []float64 `yaml:"buckets"` - LegacyQuantiles []metricObjective `yaml:"quantiles"` - MatchType MatchType `yaml:"match_type"` - HelpText string `yaml:"help"` - Action ActionType `yaml:"action"` - MatchMetricType MetricType `yaml:"match_metric_type"` - Ttl time.Duration `yaml:"ttl"` - SummaryOptions *SummaryOptions `yaml:"summary_options"` - HistogramOptions *HistogramOptions `yaml:"histogram_options"` -} - -type SummaryOptions struct { - Quantiles []metricObjective `yaml:"quantiles"` - MaxAge time.Duration `yaml:"max_age"` - AgeBuckets uint32 `yaml:"age_buckets"` - BufCap uint32 `yaml:"buf_cap"` -} - -type HistogramOptions struct { - Buckets []float64 `yaml:"buckets"` -} - -type metricObjective struct { - Quantile float64 `yaml:"quantile"` - Error float64 `yaml:"error"` -} - -var defaultQuantiles = []metricObjective{ - {Quantile: 0.5, Error: 0.05}, - {Quantile: 0.9, Error: 0.01}, - {Quantile: 0.99, Error: 0.001}, -} - -func (m *MetricMapper) InitFromYAMLString(fileContents string, cacheSize int, options ...CacheOption) error { - var n MetricMapper - - if err := yaml.Unmarshal([]byte(fileContents), &n); err != nil { - return err - } - - if n.Defaults.Buckets == nil || len(n.Defaults.Buckets) == 0 { - n.Defaults.Buckets = prometheus.DefBuckets - } - - if n.Defaults.Quantiles == nil || len(n.Defaults.Quantiles) == 0 { - n.Defaults.Quantiles = defaultQuantiles - } - - if n.Defaults.MatchType == MatchTypeDefault { - n.Defaults.MatchType = MatchTypeGlob - } - - remainingMappingsCount := len(n.Mappings) - - n.FSM = fsm.NewFSM([]string{string(MetricTypeCounter), string(MetricTypeGauge), string(MetricTypeTimer)}, - remainingMappingsCount, n.Defaults.GlobDisableOrdering) - - for i := range n.Mappings { - remainingMappingsCount-- - - currentMapping := &n.Mappings[i] - - // check that label is correct - for k := range currentMapping.Labels { - if !labelNameRE.MatchString(k) { - return fmt.Errorf("invalid label key: %s", k) - } - } - - if currentMapping.Name == "" { - return fmt.Errorf("line %d: metric mapping didn't set a metric name", i) - } - - if !metricNameRE.MatchString(currentMapping.Name) { - return fmt.Errorf("metric name '%s' doesn't match regex '%s'", currentMapping.Name, metricNameRE) - } - - if currentMapping.MatchType == "" { - currentMapping.MatchType = n.Defaults.MatchType - } - - if currentMapping.Action == "" { - currentMapping.Action = ActionTypeMap - } - - if currentMapping.MatchType == MatchTypeGlob { - n.doFSM = true - if !metricLineRE.MatchString(currentMapping.Match) { - return fmt.Errorf("invalid match: %s", currentMapping.Match) - } - - captureCount := n.FSM.AddState(currentMapping.Match, string(currentMapping.MatchMetricType), - remainingMappingsCount, currentMapping) - - currentMapping.nameFormatter = fsm.NewTemplateFormatter(currentMapping.Name, captureCount) - - labelKeys := make([]string, len(currentMapping.Labels)) - labelFormatters := make([]*fsm.TemplateFormatter, len(currentMapping.Labels)) - labelIndex := 0 - for label, valueExpr := range currentMapping.Labels { - labelKeys[labelIndex] = label - labelFormatters[labelIndex] = fsm.NewTemplateFormatter(valueExpr, captureCount) - labelIndex++ - } - currentMapping.labelFormatters = labelFormatters - currentMapping.labelKeys = labelKeys - - } else { - if regex, err := regexp.Compile(currentMapping.Match); err != nil { - return fmt.Errorf("invalid regex %s in mapping: %v", currentMapping.Match, err) - } else { - currentMapping.regex = regex - } - n.doRegex = true - } - - if currentMapping.TimerType == "" { - currentMapping.TimerType = n.Defaults.TimerType - } - - if currentMapping.LegacyQuantiles != nil && - (currentMapping.SummaryOptions == nil || currentMapping.SummaryOptions.Quantiles != nil) { - log.Warn("using the top level quantiles is deprecated. Please use quantiles in the summary_options hierarchy") - } - - if currentMapping.LegacyBuckets != nil && - (currentMapping.HistogramOptions == nil || currentMapping.HistogramOptions.Buckets != nil) { - log.Warn("using the top level buckets is deprecated. Please use buckets in the histogram_options hierarchy") - } - - if currentMapping.SummaryOptions != nil && - currentMapping.LegacyQuantiles != nil && - currentMapping.SummaryOptions.Quantiles != nil { - return fmt.Errorf("cannot use quantiles in both the top level and summary options at the same time in %s", currentMapping.Match) - } - - if currentMapping.HistogramOptions != nil && - currentMapping.LegacyBuckets != nil && - currentMapping.HistogramOptions.Buckets != nil { - return fmt.Errorf("cannot use buckets in both the top level and histogram options at the same time in %s", currentMapping.Match) - } - - if currentMapping.TimerType == TimerTypeHistogram { - if currentMapping.SummaryOptions != nil { - return fmt.Errorf("cannot use histogram timer and summary options at the same time") - } - if currentMapping.HistogramOptions == nil { - currentMapping.HistogramOptions = &HistogramOptions{} - } - if currentMapping.LegacyBuckets != nil && len(currentMapping.LegacyBuckets) != 0 { - currentMapping.HistogramOptions.Buckets = currentMapping.LegacyBuckets - } - if currentMapping.HistogramOptions.Buckets == nil || len(currentMapping.HistogramOptions.Buckets) == 0 { - currentMapping.HistogramOptions.Buckets = n.Defaults.Buckets - } - } - - if currentMapping.TimerType == TimerTypeSummary { - if currentMapping.HistogramOptions != nil { - return fmt.Errorf("cannot use summary timer and histogram options at the same time") - } - if currentMapping.SummaryOptions == nil { - currentMapping.SummaryOptions = &SummaryOptions{} - } - if currentMapping.LegacyQuantiles != nil && len(currentMapping.LegacyQuantiles) != 0 { - currentMapping.SummaryOptions.Quantiles = currentMapping.LegacyQuantiles - } - if currentMapping.SummaryOptions.Quantiles == nil || len(currentMapping.SummaryOptions.Quantiles) == 0 { - currentMapping.SummaryOptions.Quantiles = n.Defaults.Quantiles - } - } - - if currentMapping.Ttl == 0 && n.Defaults.Ttl > 0 { - currentMapping.Ttl = n.Defaults.Ttl - } - - } - - m.mutex.Lock() - defer m.mutex.Unlock() - - m.Defaults = n.Defaults - m.Mappings = n.Mappings - m.InitCache(cacheSize, options...) - - if n.doFSM { - var mappings []string - for _, mapping := range n.Mappings { - if mapping.MatchType == MatchTypeGlob { - mappings = append(mappings, mapping.Match) - } - } - n.FSM.BacktrackingNeeded = fsm.TestIfNeedBacktracking(mappings, n.FSM.OrderingDisabled) - - m.FSM = n.FSM - m.doRegex = n.doRegex - } - m.doFSM = n.doFSM - - if m.MappingsCount != nil { - m.MappingsCount.Set(float64(len(n.Mappings))) - } - return nil -} - -func (m *MetricMapper) InitFromFile(fileName string, cacheSize int, options ...CacheOption) error { - mappingStr, err := ioutil.ReadFile(fileName) - if err != nil { - return err - } - - return m.InitFromYAMLString(string(mappingStr), cacheSize, options...) -} - -func (m *MetricMapper) InitCache(cacheSize int, options ...CacheOption) { - if cacheSize == 0 { - m.cache = NewMetricMapperNoopCache() - } else { - o := cacheOptions{ - cacheType: "lru", - } - for _, f := range options { - f(&o) - } - - var ( - cache MetricMapperCache - err error - ) - switch o.cacheType { - case "lru": - cache, err = NewMetricMapperCache(cacheSize) - case "random": - cache, err = NewMetricMapperRRCache(cacheSize) - default: - err = fmt.Errorf("unsupported cache type %q", o.cacheType) - } - - if err != nil { - log.Fatalf("Unable to setup metric cache. Caused by: %s", err) - } - m.cache = cache - } -} - -func (m *MetricMapper) GetMapping(statsdMetric string, statsdMetricType MetricType) (*MetricMapping, prometheus.Labels, bool) { - m.mutex.RLock() - defer m.mutex.RUnlock() - result, cached := m.cache.Get(statsdMetric, statsdMetricType) - if cached { - return result.Mapping, result.Labels, result.Matched - } - // glob matching - if m.doFSM { - finalState, captures := m.FSM.GetMapping(statsdMetric, string(statsdMetricType)) - if finalState != nil && finalState.Result != nil { - v := finalState.Result.(*MetricMapping) - result := copyMetricMapping(v) - result.Name = result.nameFormatter.Format(captures) - - labels := prometheus.Labels{} - for index, formatter := range result.labelFormatters { - labels[result.labelKeys[index]] = formatter.Format(captures) - } - - m.cache.AddMatch(statsdMetric, statsdMetricType, result, labels) - - return result, labels, true - } else if !m.doRegex { - // if there's no regex match type, return immediately - m.cache.AddMiss(statsdMetric, statsdMetricType) - return nil, nil, false - } - } - - // regex matching - for _, mapping := range m.Mappings { - // if a rule don't have regex matching type, the regex field is unset - if mapping.regex == nil { - continue - } - matches := mapping.regex.FindStringSubmatchIndex(statsdMetric) - if len(matches) == 0 { - continue - } - - mapping.Name = string(mapping.regex.ExpandString( - []byte{}, - mapping.Name, - statsdMetric, - matches, - )) - - if mt := mapping.MatchMetricType; mt != "" && mt != statsdMetricType { - continue - } - - labels := prometheus.Labels{} - for label, valueExpr := range mapping.Labels { - value := mapping.regex.ExpandString([]byte{}, valueExpr, statsdMetric, matches) - labels[label] = string(value) - } - - m.cache.AddMatch(statsdMetric, statsdMetricType, &mapping, labels) - - return &mapping, labels, true - } - - m.cache.AddMiss(statsdMetric, statsdMetricType) - return nil, nil, false -} - -// make a shallow copy so that we do not overwrite name -// as multiple names can be matched by same mapping -func copyMetricMapping(in *MetricMapping) *MetricMapping { - var out MetricMapping - out = *in - return &out -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import ( + "fmt" + "io/ioutil" + "regexp" + "sync" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/log" + "github.com/prometheus/statsd_exporter/pkg/mapper/fsm" + yaml "gopkg.in/yaml.v2" +) + +var ( + statsdMetricRE = `[a-zA-Z_](-?[a-zA-Z0-9_])+` + templateReplaceRE = `(\$\{?\d+\}?)` + + metricLineRE = regexp.MustCompile(`^(\*\.|` + statsdMetricRE + `\.)+(\*|` + statsdMetricRE + `)$`) + metricNameRE = regexp.MustCompile(`^([a-zA-Z_]|` + templateReplaceRE + `)([a-zA-Z0-9_]|` + templateReplaceRE + `)*$`) + labelNameRE = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_]+$`) +) + +type mapperConfigDefaults struct { + TimerType TimerType `yaml:"timer_type"` + Buckets []float64 `yaml:"buckets"` + Quantiles []metricObjective `yaml:"quantiles"` + MatchType MatchType `yaml:"match_type"` + GlobDisableOrdering bool `yaml:"glob_disable_ordering"` + Ttl time.Duration `yaml:"ttl"` +} + +type MetricMapper struct { + Defaults mapperConfigDefaults `yaml:"defaults"` + Mappings []MetricMapping `yaml:"mappings"` + FSM *fsm.FSM + doFSM bool + doRegex bool + cache MetricMapperCache + mutex sync.RWMutex + + MappingsCount prometheus.Gauge +} + +type MetricMapping struct { + Match string `yaml:"match"` + Name string `yaml:"name"` + nameFormatter *fsm.TemplateFormatter + regex *regexp.Regexp + Labels prometheus.Labels `yaml:"labels"` + labelKeys []string + labelFormatters []*fsm.TemplateFormatter + TimerType TimerType `yaml:"timer_type"` + LegacyBuckets []float64 `yaml:"buckets"` + LegacyQuantiles []metricObjective `yaml:"quantiles"` + MatchType MatchType `yaml:"match_type"` + HelpText string `yaml:"help"` + Action ActionType `yaml:"action"` + MatchMetricType MetricType `yaml:"match_metric_type"` + Ttl time.Duration `yaml:"ttl"` + SummaryOptions *SummaryOptions `yaml:"summary_options"` + HistogramOptions *HistogramOptions `yaml:"histogram_options"` +} + +type SummaryOptions struct { + Quantiles []metricObjective `yaml:"quantiles"` + MaxAge time.Duration `yaml:"max_age"` + AgeBuckets uint32 `yaml:"age_buckets"` + BufCap uint32 `yaml:"buf_cap"` +} + +type HistogramOptions struct { + Buckets []float64 `yaml:"buckets"` +} + +type metricObjective struct { + Quantile float64 `yaml:"quantile"` + Error float64 `yaml:"error"` +} + +var defaultQuantiles = []metricObjective{ + {Quantile: 0.5, Error: 0.05}, + {Quantile: 0.9, Error: 0.01}, + {Quantile: 0.99, Error: 0.001}, +} + +func (m *MetricMapper) InitFromYAMLString(fileContents string, cacheSize int, options ...CacheOption) error { + var n MetricMapper + + if err := yaml.Unmarshal([]byte(fileContents), &n); err != nil { + return err + } + + if n.Defaults.Buckets == nil || len(n.Defaults.Buckets) == 0 { + n.Defaults.Buckets = prometheus.DefBuckets + } + + if n.Defaults.Quantiles == nil || len(n.Defaults.Quantiles) == 0 { + n.Defaults.Quantiles = defaultQuantiles + } + + if n.Defaults.MatchType == MatchTypeDefault { + n.Defaults.MatchType = MatchTypeGlob + } + + remainingMappingsCount := len(n.Mappings) + + n.FSM = fsm.NewFSM([]string{string(MetricTypeCounter), string(MetricTypeGauge), string(MetricTypeTimer)}, + remainingMappingsCount, n.Defaults.GlobDisableOrdering) + + for i := range n.Mappings { + remainingMappingsCount-- + + currentMapping := &n.Mappings[i] + + // check that label is correct + for k := range currentMapping.Labels { + if !labelNameRE.MatchString(k) { + return fmt.Errorf("invalid label key: %s", k) + } + } + + if currentMapping.Name == "" { + return fmt.Errorf("line %d: metric mapping didn't set a metric name", i) + } + + if !metricNameRE.MatchString(currentMapping.Name) { + return fmt.Errorf("metric name '%s' doesn't match regex '%s'", currentMapping.Name, metricNameRE) + } + + if currentMapping.MatchType == "" { + currentMapping.MatchType = n.Defaults.MatchType + } + + if currentMapping.Action == "" { + currentMapping.Action = ActionTypeMap + } + + if currentMapping.MatchType == MatchTypeGlob { + n.doFSM = true + if !metricLineRE.MatchString(currentMapping.Match) { + return fmt.Errorf("invalid match: %s", currentMapping.Match) + } + + captureCount := n.FSM.AddState(currentMapping.Match, string(currentMapping.MatchMetricType), + remainingMappingsCount, currentMapping) + + currentMapping.nameFormatter = fsm.NewTemplateFormatter(currentMapping.Name, captureCount) + + labelKeys := make([]string, len(currentMapping.Labels)) + labelFormatters := make([]*fsm.TemplateFormatter, len(currentMapping.Labels)) + labelIndex := 0 + for label, valueExpr := range currentMapping.Labels { + labelKeys[labelIndex] = label + labelFormatters[labelIndex] = fsm.NewTemplateFormatter(valueExpr, captureCount) + labelIndex++ + } + currentMapping.labelFormatters = labelFormatters + currentMapping.labelKeys = labelKeys + + } else { + if regex, err := regexp.Compile(currentMapping.Match); err != nil { + return fmt.Errorf("invalid regex %s in mapping: %v", currentMapping.Match, err) + } else { + currentMapping.regex = regex + } + n.doRegex = true + } + + if currentMapping.TimerType == "" { + currentMapping.TimerType = n.Defaults.TimerType + } + + if currentMapping.LegacyQuantiles != nil && + (currentMapping.SummaryOptions == nil || currentMapping.SummaryOptions.Quantiles != nil) { + log.Warn("using the top level quantiles is deprecated. Please use quantiles in the summary_options hierarchy") + } + + if currentMapping.LegacyBuckets != nil && + (currentMapping.HistogramOptions == nil || currentMapping.HistogramOptions.Buckets != nil) { + log.Warn("using the top level buckets is deprecated. Please use buckets in the histogram_options hierarchy") + } + + if currentMapping.SummaryOptions != nil && + currentMapping.LegacyQuantiles != nil && + currentMapping.SummaryOptions.Quantiles != nil { + return fmt.Errorf("cannot use quantiles in both the top level and summary options at the same time in %s", currentMapping.Match) + } + + if currentMapping.HistogramOptions != nil && + currentMapping.LegacyBuckets != nil && + currentMapping.HistogramOptions.Buckets != nil { + return fmt.Errorf("cannot use buckets in both the top level and histogram options at the same time in %s", currentMapping.Match) + } + + if currentMapping.TimerType == TimerTypeHistogram { + if currentMapping.SummaryOptions != nil { + return fmt.Errorf("cannot use histogram timer and summary options at the same time") + } + if currentMapping.HistogramOptions == nil { + currentMapping.HistogramOptions = &HistogramOptions{} + } + if currentMapping.LegacyBuckets != nil && len(currentMapping.LegacyBuckets) != 0 { + currentMapping.HistogramOptions.Buckets = currentMapping.LegacyBuckets + } + if currentMapping.HistogramOptions.Buckets == nil || len(currentMapping.HistogramOptions.Buckets) == 0 { + currentMapping.HistogramOptions.Buckets = n.Defaults.Buckets + } + } + + if currentMapping.TimerType == TimerTypeSummary { + if currentMapping.HistogramOptions != nil { + return fmt.Errorf("cannot use summary timer and histogram options at the same time") + } + if currentMapping.SummaryOptions == nil { + currentMapping.SummaryOptions = &SummaryOptions{} + } + if currentMapping.LegacyQuantiles != nil && len(currentMapping.LegacyQuantiles) != 0 { + currentMapping.SummaryOptions.Quantiles = currentMapping.LegacyQuantiles + } + if currentMapping.SummaryOptions.Quantiles == nil || len(currentMapping.SummaryOptions.Quantiles) == 0 { + currentMapping.SummaryOptions.Quantiles = n.Defaults.Quantiles + } + } + + if currentMapping.Ttl == 0 && n.Defaults.Ttl > 0 { + currentMapping.Ttl = n.Defaults.Ttl + } + + } + + m.mutex.Lock() + defer m.mutex.Unlock() + + m.Defaults = n.Defaults + m.Mappings = n.Mappings + m.InitCache(cacheSize, options...) + + if n.doFSM { + var mappings []string + for _, mapping := range n.Mappings { + if mapping.MatchType == MatchTypeGlob { + mappings = append(mappings, mapping.Match) + } + } + n.FSM.BacktrackingNeeded = fsm.TestIfNeedBacktracking(mappings, n.FSM.OrderingDisabled) + + m.FSM = n.FSM + m.doRegex = n.doRegex + } + m.doFSM = n.doFSM + + if m.MappingsCount != nil { + m.MappingsCount.Set(float64(len(n.Mappings))) + } + return nil +} + +func (m *MetricMapper) InitFromFile(fileName string, cacheSize int, options ...CacheOption) error { + mappingStr, err := ioutil.ReadFile(fileName) + if err != nil { + return err + } + + return m.InitFromYAMLString(string(mappingStr), cacheSize, options...) +} + +func (m *MetricMapper) InitCache(cacheSize int, options ...CacheOption) { + if cacheSize == 0 { + m.cache = NewMetricMapperNoopCache() + } else { + o := cacheOptions{ + cacheType: "lru", + } + for _, f := range options { + f(&o) + } + + var ( + cache MetricMapperCache + err error + ) + switch o.cacheType { + case "lru": + cache, err = NewMetricMapperCache(cacheSize) + case "random": + cache, err = NewMetricMapperRRCache(cacheSize) + default: + err = fmt.Errorf("unsupported cache type %q", o.cacheType) + } + + if err != nil { + log.Fatalf("Unable to setup metric cache. Caused by: %s", err) + } + m.cache = cache + } +} + +func (m *MetricMapper) GetMapping(statsdMetric string, statsdMetricType MetricType) (*MetricMapping, prometheus.Labels, bool) { + m.mutex.RLock() + defer m.mutex.RUnlock() + result, cached := m.cache.Get(statsdMetric, statsdMetricType) + if cached { + return result.Mapping, result.Labels, result.Matched + } + // glob matching + if m.doFSM { + finalState, captures := m.FSM.GetMapping(statsdMetric, string(statsdMetricType)) + if finalState != nil && finalState.Result != nil { + v := finalState.Result.(*MetricMapping) + result := copyMetricMapping(v) + result.Name = result.nameFormatter.Format(captures) + + labels := prometheus.Labels{} + for index, formatter := range result.labelFormatters { + labels[result.labelKeys[index]] = formatter.Format(captures) + } + + m.cache.AddMatch(statsdMetric, statsdMetricType, result, labels) + + return result, labels, true + } else if !m.doRegex { + // if there's no regex match type, return immediately + m.cache.AddMiss(statsdMetric, statsdMetricType) + return nil, nil, false + } + } + + // regex matching + for _, mapping := range m.Mappings { + // if a rule don't have regex matching type, the regex field is unset + if mapping.regex == nil { + continue + } + matches := mapping.regex.FindStringSubmatchIndex(statsdMetric) + if len(matches) == 0 { + continue + } + + mapping.Name = string(mapping.regex.ExpandString( + []byte{}, + mapping.Name, + statsdMetric, + matches, + )) + + if mt := mapping.MatchMetricType; mt != "" && mt != statsdMetricType { + continue + } + + labels := prometheus.Labels{} + for label, valueExpr := range mapping.Labels { + value := mapping.regex.ExpandString([]byte{}, valueExpr, statsdMetric, matches) + labels[label] = string(value) + } + + m.cache.AddMatch(statsdMetric, statsdMetricType, &mapping, labels) + + return &mapping, labels, true + } + + m.cache.AddMiss(statsdMetric, statsdMetricType) + return nil, nil, false +} + +// make a shallow copy so that we do not overwrite name +// as multiple names can be matched by same mapping +func copyMetricMapping(in *MetricMapping) *MetricMapping { + var out MetricMapping + out = *in + return &out +} diff --git a/pkg/mapper/mapper_benchmark_test.go b/pkg/mapper/mapper_benchmark_test.go index 9210571..4c5c6ae 100644 --- a/pkg/mapper/mapper_benchmark_test.go +++ b/pkg/mapper/mapper_benchmark_test.go @@ -1,1000 +1,1000 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import ( - "fmt" - "math/rand" - "testing" -) - -var ( - ruleTemplateSingleMatchGlob = ` -- match: metric%d.* - name: "metric_single" - labels: - name: "$1" -` - ruleTemplateSingleMatchRegex = ` -- match: metric%d\.([^.]*) - name: "metric_single" - labels: - name: "$1" -` - - ruleTemplateMultipleMatchGlob = ` -- match: metric%d.*.*.*.*.*.*.*.*.*.*.*.* - name: "metric_multi" - labels: - name: "$1-$2-$3.$4-$5-$6.$7-$8-$9.$10-$11-$12" -` - - ruleTemplateMultipleMatchRegex = ` -- match: metric%d\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) - name: "metric_multi" - labels: - name: "$1-$2-$3.$4-$5-$6.$7-$8-$9.$10-$11-$12" -` -) - -func duplicateRules(count int, template string) string { - rules := "" - for i := 0; i < count; i++ { - rules += fmt.Sprintf(template, i) - } - return rules -} - -func BenchmarkGlob(b *testing.B) { - config := `--- -mappings: -- match: test.dispatcher.*.*.succeeded - name: "dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "succeeded" - job: "test_dispatcher" -- match: test.my-dispatch-host01.name.dispatcher.*.*.* - name: "host_dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "$3" - job: "test_dispatcher" -- match: request_time.*.*.*.*.*.*.*.*.*.*.*.* - name: "tyk_http_request" - labels: - method_and_path: "${1}" - response_code: "${2}" - apikey: "${3}" - apiversion: "${4}" - apiname: "${5}" - apiid: "${6}" - ipv4_t1: "${7}" - ipv4_t2: "${8}" - ipv4_t3: "${9}" - ipv4_t4: "${10}" - orgid: "${11}" - oauthid: "${12}" -- match: "*.*" - name: "catchall" - labels: - first: "$1" - second: "$2" - third: "$3" - job: "-" - ` - mappings := []string{ - "test.dispatcher.FooProcessor.send.succeeded", - "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", - "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", - "foo.bar", - "foo.bar.baz", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlobNoOrdering(b *testing.B) { - config := `--- -defaults: - glob_disable_ordering: true -mappings: -- match: test.dispatcher.*.*.succeeded - name: "dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "succeeded" - job: "test_dispatcher" -- match: test.my-dispatch-host01.name.dispatcher.*.*.* - name: "host_dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "$3" - job: "test_dispatcher" -- match: request_time.*.*.*.*.*.*.*.*.*.*.*.* - name: "tyk_http_request" - labels: - method_and_path: "${1}" - response_code: "${2}" - apikey: "${3}" - apiversion: "${4}" - apiname: "${5}" - apiid: "${6}" - ipv4_t1: "${7}" - ipv4_t2: "${8}" - ipv4_t3: "${9}" - ipv4_t4: "${10}" - orgid: "${11}" - oauthid: "${12}" -- match: "*.*" - name: "catchall" - labels: - first: "$1" - second: "$2" - third: "$3" - job: "-" - ` - mappings := []string{ - "test.dispatcher.FooProcessor.send.succeeded", - "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", - "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", - "foo.bar", - "foo.bar.baz", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlobNoOrderingWithBacktracking(b *testing.B) { - config := `--- -defaults: - glob_disable_ordering: true -mappings: -- match: test.dispatcher.*.*.succeeded - name: "dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "succeeded" - job: "test_dispatcher" -- match: test.dispatcher.*.received.* - name: "dispatch_events_wont_match" - labels: - processor: "$1" - action: "received" - result: "$2" - job: "test_dispatcher" -- match: test.my-dispatch-host01.name.dispatcher.*.*.* - name: "host_dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "$3" - job: "test_dispatcher" -- match: request_time.*.*.*.*.*.*.*.*.*.*.*.* - name: "tyk_http_request" - labels: - method_and_path: "${1}" - response_code: "${2}" - apikey: "${3}" - apiversion: "${4}" - apiname: "${5}" - apiid: "${6}" - ipv4_t1: "${7}" - ipv4_t2: "${8}" - ipv4_t3: "${9}" - ipv4_t4: "${10}" - orgid: "${11}" - oauthid: "${12}" -- match: "*.*" - name: "catchall" - labels: - first: "$1" - second: "$2" - third: "$3" - job: "-" - ` - mappings := []string{ - "test.dispatcher.FooProcessor.send.succeeded", - "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", - "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", - "foo.bar", - "foo.bar.baz", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegex(b *testing.B) { - config := `--- -defaults: - match_type: regex -mappings: -- match: test\.dispatcher\.([^.]*)\.([^.]*)\.([^.]*) - name: "dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "$3" - job: "test_dispatcher" -- match: test.my-dispatch-host01.name.dispatcher\.([^.]*)\.([^.]*)\.([^.]*) - name: "host_dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "$3" - job: "test_dispatcher" -- match: request_time\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) - name: "tyk_http_request" - labels: - method_and_path: "${1}" - response_code: "${2}" - apikey: "${3}" - apiversion: "${4}" - apiname: "${5}" - apiid: "${6}" - ipv4_t1: "${7}" - ipv4_t2: "${8}" - ipv4_t3: "${9}" - ipv4_t4: "${10}" - orgid: "${11}" - oauthid: "${12}" -- match: \.([^.]*)\.([^.]*) - name: "catchall" - labels: - first: "$1" - second: "$2" - third: "$3" - job: "-" - ` - mappings := []string{ - "test.dispatcher.FooProcessor.send.succeeded", - "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", - "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", - "foo.bar", - "foo.bar.baz", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlobSingleMatch(b *testing.B) { - config := `--- -mappings: -- match: metric.* - name: "metric_one" - labels: - name: "$1" - ` - mappings := []string{ - "metric.aaa", - "metric.bbb", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegexSingleMatch(b *testing.B) { - config := `--- -mappings: -- match: metric\.([^.]*) - name: "metric_one" - match_type: regex - labels: - name: "$1" - ` - mappings := []string{ - "metric.aaa", - "metric.bbb", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlobMultipleCaptures(b *testing.B) { - config := `--- -mappings: -- match: metric.*.*.*.*.*.*.*.*.*.*.*.* - name: "metric_multi" - labels: - name: "$1-$2-$3.$4-$5-$6.$7-$8-$9.$10-$11-$12" - ` - mappings := []string{ - "metric.a.b.c.d.e.f.g.h.i.j.k.l", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegexMultipleCaptures(b *testing.B) { - config := `--- -mappings: -- match: metric\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) - name: "metric_multi" - match_type: regex - labels: - name: "$1-$2-$3.$4-$5-$6.$7-$8-$9.$10-$11-$12" - ` - mappings := []string{ - "metric.a.b.c.d.e.f.g.h.i.j.k.l", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlobMultipleCapturesNoFormat(b *testing.B) { - config := `--- -mappings: -- match: metric.*.*.*.*.*.*.*.*.*.*.*.* - name: "metric_multi" - labels: - name: "not_relevant" - ` - mappings := []string{ - "metric.a.b.c.d.e.f.g.h.i.j.k.l", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegexMultipleCapturesNoFormat(b *testing.B) { - config := `--- -mappings: -- match: metric\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) - name: "metric_multi" - match_type: regex - labels: - name: "not_relevant" - ` - mappings := []string{ - "metric.a.b.c.d.e.f.g.h.i.j.k.l", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlobMultipleCapturesDifferentLabels(b *testing.B) { - config := `--- -mappings: -- match: metric.*.*.*.*.*.*.*.*.*.*.*.* - name: "metric_multi" - labels: - label1: "$1" - label2: "$2" - label3: "$3" - label4: "$4" - label5: "$5" - label6: "$6" - label7: "$7" - label8: "$8" - label9: "$9" - label10: "$10" - label11: "$11" - label12: "$12" - ` - mappings := []string{ - "metric.a.b.c.d.e.f.g.h.i.j.k.l", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegexMultipleCapturesDifferentLabels(b *testing.B) { - config := `--- -mappings: -- match: metric\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) - name: "metric_multi" - match_type: regex - labels: - label1: "$1" - label2: "$2" - label3: "$3" - label4: "$4" - label5: "$5" - label6: "$6" - label7: "$7" - label8: "$8" - label9: "$9" - label10: "$10" - label11: "$11" - label12: "$12" - ` - mappings := []string{ - "metric.a.b.c.d.e.f.g.h.i.j.k.l", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlob10Rules(b *testing.B) { - config := `--- -mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) - mappings := []string{ - "metric100.a", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlob10RulesCached(b *testing.B) { - config := `--- -mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) - mappings := []string{ - "metric100.a", - } - - for _, cacheType := range []string{"lru", "random"} { - b.Run(cacheType, func(b *testing.B) { - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } - }) - } -} - -func BenchmarkRegex10RulesAverage(b *testing.B) { - config := `--- -defaults: - match_type: regex -mappings:` + duplicateRules(10, ruleTemplateSingleMatchRegex) - mappings := []string{ - "metric5.a", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegex10RulesAverageCached(b *testing.B) { - config := `--- -defaults: - match_type: regex -mappings:` + duplicateRules(10, ruleTemplateSingleMatchRegex) - mappings := []string{ - "metric5.a", - } - - for _, cacheType := range []string{"lru", "random"} { - b.Run(cacheType, func(b *testing.B) { - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } - }) - } -} - -func BenchmarkGlob100Rules(b *testing.B) { - config := `--- -mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) - mappings := []string{ - "metric100.a", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlob100RulesCached(b *testing.B) { - config := `--- -mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) - mappings := []string{ - "metric100.a", - } - - for _, cacheType := range []string{"lru", "random"} { - b.Run(cacheType, func(b *testing.B) { - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } - }) - } -} - -func BenchmarkGlob100RulesNoMatch(b *testing.B) { - config := `--- -mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) - mappings := []string{ - "metricnomatchy.a", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlob100RulesNoOrderingNoMatch(b *testing.B) { - config := `--- -defaults: - glob_disable_ordering: true -mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) - mappings := []string{ - "metricnomatchy.a", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegex100RulesAverage(b *testing.B) { - config := `--- -defaults: - match_type: regex -mappings:` + duplicateRules(100, ruleTemplateSingleMatchRegex) - mappings := []string{ - "metric50.a", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegex100RulesWorst(b *testing.B) { - config := `--- -defaults: - match_type: regex -mappings:` + duplicateRules(100, ruleTemplateSingleMatchRegex) - mappings := []string{ - "metric100.a", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlob100RulesMultipleCaptures(b *testing.B) { - config := `--- -mappings:` + duplicateRules(100, ruleTemplateMultipleMatchGlob) - mappings := []string{ - "metric50.a.b.c.d.e.f.g.h.i.j.k.l", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkGlob100RulesMultipleCapturesCached(b *testing.B) { - config := `--- -mappings:` + duplicateRules(100, ruleTemplateMultipleMatchGlob) - mappings := []string{ - "metric50.a.b.c.d.e.f.g.h.i.j.k.l", - } - - for _, cacheType := range []string{"lru", "random"} { - b.Run(cacheType, func(b *testing.B) { - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } - }) - } -} - -func BenchmarkRegex100RulesMultipleCapturesAverage(b *testing.B) { - config := `--- -defaults: - match_type: regex -mappings:` + duplicateRules(100, ruleTemplateMultipleMatchRegex) - mappings := []string{ - "metric50.a.b.c.d.e.f.g.h.i.j.k.l", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegex100RulesMultipleCapturesWorst(b *testing.B) { - config := `--- -defaults: - match_type: regex -mappings:` + duplicateRules(100, ruleTemplateMultipleMatchRegex) - mappings := []string{ - "metric100.a.b.c.d.e.f.g.h.i.j.k.l", - } - - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } -} - -func BenchmarkRegex100RulesMultipleCapturesWorstCached(b *testing.B) { - config := `--- -defaults: - match_type: regex -mappings:` + duplicateRules(100, ruleTemplateMultipleMatchRegex) - mappings := []string{ - "metric100.a.b.c.d.e.f.g.h.i.j.k.l", - } - - for _, cacheType := range []string{"lru", "random"} { - b.Run(cacheType, func(b *testing.B) { - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } - }) - } -} - -func duplicateMetrics(count int, template string) []string { - var out []string - for i := 0; i < count; i++ { - out = append(out, fmt.Sprintf(template, i)) - } - return out -} - -func BenchmarkGlob100RulesCached100Metrics(b *testing.B) { - config := `--- -mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) - - mappings := duplicateMetrics(100, "metric100") - - for _, cacheType := range []string{"lru", "random"} { - b.Run(cacheType, func(b *testing.B) { - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } - }) - } -} - -func BenchmarkGlob100RulesCached100MetricsSmallCache(b *testing.B) { - // This benchmark is the worst case for the LRU cache. - // The cache is smaller than the total number of metrics and - // we iterate linearly through the metrics, so we will - // constantly evict cache entries. - config := `--- -mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) - - mappings := duplicateMetrics(100, "metric100") - - for _, cacheType := range []string{"lru", "random"} { - b.Run(cacheType, func(b *testing.B) { - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 50, WithCacheType(cacheType)) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } - }) - } -} - -func BenchmarkGlob100RulesCached100MetricsRandomSmallCache(b *testing.B) { - // Slighly more realistic benchmark with a smaller cache. - // Randomly match metrics so we should have some cache hits. - config := `--- -mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) - - base := duplicateMetrics(100, "metric100") - var mappings []string - for i := 0; i < 10; i++ { - mappings = append(mappings, base...) - } - - r := rand.New(rand.NewSource(42)) - r.Shuffle(len(mappings), func(i, j int) { - mappings[i], mappings[j] = mappings[j], mappings[i] - }) - - for _, cacheType := range []string{"lru", "random"} { - b.Run(cacheType, func(b *testing.B) { - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 50, WithCacheType(cacheType)) - if err != nil { - b.Fatalf("Config load error: %s %s", config, err) - } - - b.ResetTimer() - for j := 0; j < b.N; j++ { - for _, metric := range mappings { - mapper.GetMapping(metric, MetricTypeCounter) - } - } - }) - } -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import ( + "fmt" + "math/rand" + "testing" +) + +var ( + ruleTemplateSingleMatchGlob = ` +- match: metric%d.* + name: "metric_single" + labels: + name: "$1" +` + ruleTemplateSingleMatchRegex = ` +- match: metric%d\.([^.]*) + name: "metric_single" + labels: + name: "$1" +` + + ruleTemplateMultipleMatchGlob = ` +- match: metric%d.*.*.*.*.*.*.*.*.*.*.*.* + name: "metric_multi" + labels: + name: "$1-$2-$3.$4-$5-$6.$7-$8-$9.$10-$11-$12" +` + + ruleTemplateMultipleMatchRegex = ` +- match: metric%d\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) + name: "metric_multi" + labels: + name: "$1-$2-$3.$4-$5-$6.$7-$8-$9.$10-$11-$12" +` +) + +func duplicateRules(count int, template string) string { + rules := "" + for i := 0; i < count; i++ { + rules += fmt.Sprintf(template, i) + } + return rules +} + +func BenchmarkGlob(b *testing.B) { + config := `--- +mappings: +- match: test.dispatcher.*.*.succeeded + name: "dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "succeeded" + job: "test_dispatcher" +- match: test.my-dispatch-host01.name.dispatcher.*.*.* + name: "host_dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "$3" + job: "test_dispatcher" +- match: request_time.*.*.*.*.*.*.*.*.*.*.*.* + name: "tyk_http_request" + labels: + method_and_path: "${1}" + response_code: "${2}" + apikey: "${3}" + apiversion: "${4}" + apiname: "${5}" + apiid: "${6}" + ipv4_t1: "${7}" + ipv4_t2: "${8}" + ipv4_t3: "${9}" + ipv4_t4: "${10}" + orgid: "${11}" + oauthid: "${12}" +- match: "*.*" + name: "catchall" + labels: + first: "$1" + second: "$2" + third: "$3" + job: "-" + ` + mappings := []string{ + "test.dispatcher.FooProcessor.send.succeeded", + "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", + "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", + "foo.bar", + "foo.bar.baz", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlobNoOrdering(b *testing.B) { + config := `--- +defaults: + glob_disable_ordering: true +mappings: +- match: test.dispatcher.*.*.succeeded + name: "dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "succeeded" + job: "test_dispatcher" +- match: test.my-dispatch-host01.name.dispatcher.*.*.* + name: "host_dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "$3" + job: "test_dispatcher" +- match: request_time.*.*.*.*.*.*.*.*.*.*.*.* + name: "tyk_http_request" + labels: + method_and_path: "${1}" + response_code: "${2}" + apikey: "${3}" + apiversion: "${4}" + apiname: "${5}" + apiid: "${6}" + ipv4_t1: "${7}" + ipv4_t2: "${8}" + ipv4_t3: "${9}" + ipv4_t4: "${10}" + orgid: "${11}" + oauthid: "${12}" +- match: "*.*" + name: "catchall" + labels: + first: "$1" + second: "$2" + third: "$3" + job: "-" + ` + mappings := []string{ + "test.dispatcher.FooProcessor.send.succeeded", + "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", + "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", + "foo.bar", + "foo.bar.baz", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlobNoOrderingWithBacktracking(b *testing.B) { + config := `--- +defaults: + glob_disable_ordering: true +mappings: +- match: test.dispatcher.*.*.succeeded + name: "dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "succeeded" + job: "test_dispatcher" +- match: test.dispatcher.*.received.* + name: "dispatch_events_wont_match" + labels: + processor: "$1" + action: "received" + result: "$2" + job: "test_dispatcher" +- match: test.my-dispatch-host01.name.dispatcher.*.*.* + name: "host_dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "$3" + job: "test_dispatcher" +- match: request_time.*.*.*.*.*.*.*.*.*.*.*.* + name: "tyk_http_request" + labels: + method_and_path: "${1}" + response_code: "${2}" + apikey: "${3}" + apiversion: "${4}" + apiname: "${5}" + apiid: "${6}" + ipv4_t1: "${7}" + ipv4_t2: "${8}" + ipv4_t3: "${9}" + ipv4_t4: "${10}" + orgid: "${11}" + oauthid: "${12}" +- match: "*.*" + name: "catchall" + labels: + first: "$1" + second: "$2" + third: "$3" + job: "-" + ` + mappings := []string{ + "test.dispatcher.FooProcessor.send.succeeded", + "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", + "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", + "foo.bar", + "foo.bar.baz", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegex(b *testing.B) { + config := `--- +defaults: + match_type: regex +mappings: +- match: test\.dispatcher\.([^.]*)\.([^.]*)\.([^.]*) + name: "dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "$3" + job: "test_dispatcher" +- match: test.my-dispatch-host01.name.dispatcher\.([^.]*)\.([^.]*)\.([^.]*) + name: "host_dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "$3" + job: "test_dispatcher" +- match: request_time\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) + name: "tyk_http_request" + labels: + method_and_path: "${1}" + response_code: "${2}" + apikey: "${3}" + apiversion: "${4}" + apiname: "${5}" + apiid: "${6}" + ipv4_t1: "${7}" + ipv4_t2: "${8}" + ipv4_t3: "${9}" + ipv4_t4: "${10}" + orgid: "${11}" + oauthid: "${12}" +- match: \.([^.]*)\.([^.]*) + name: "catchall" + labels: + first: "$1" + second: "$2" + third: "$3" + job: "-" + ` + mappings := []string{ + "test.dispatcher.FooProcessor.send.succeeded", + "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", + "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", + "foo.bar", + "foo.bar.baz", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlobSingleMatch(b *testing.B) { + config := `--- +mappings: +- match: metric.* + name: "metric_one" + labels: + name: "$1" + ` + mappings := []string{ + "metric.aaa", + "metric.bbb", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegexSingleMatch(b *testing.B) { + config := `--- +mappings: +- match: metric\.([^.]*) + name: "metric_one" + match_type: regex + labels: + name: "$1" + ` + mappings := []string{ + "metric.aaa", + "metric.bbb", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlobMultipleCaptures(b *testing.B) { + config := `--- +mappings: +- match: metric.*.*.*.*.*.*.*.*.*.*.*.* + name: "metric_multi" + labels: + name: "$1-$2-$3.$4-$5-$6.$7-$8-$9.$10-$11-$12" + ` + mappings := []string{ + "metric.a.b.c.d.e.f.g.h.i.j.k.l", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegexMultipleCaptures(b *testing.B) { + config := `--- +mappings: +- match: metric\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) + name: "metric_multi" + match_type: regex + labels: + name: "$1-$2-$3.$4-$5-$6.$7-$8-$9.$10-$11-$12" + ` + mappings := []string{ + "metric.a.b.c.d.e.f.g.h.i.j.k.l", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlobMultipleCapturesNoFormat(b *testing.B) { + config := `--- +mappings: +- match: metric.*.*.*.*.*.*.*.*.*.*.*.* + name: "metric_multi" + labels: + name: "not_relevant" + ` + mappings := []string{ + "metric.a.b.c.d.e.f.g.h.i.j.k.l", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegexMultipleCapturesNoFormat(b *testing.B) { + config := `--- +mappings: +- match: metric\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) + name: "metric_multi" + match_type: regex + labels: + name: "not_relevant" + ` + mappings := []string{ + "metric.a.b.c.d.e.f.g.h.i.j.k.l", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlobMultipleCapturesDifferentLabels(b *testing.B) { + config := `--- +mappings: +- match: metric.*.*.*.*.*.*.*.*.*.*.*.* + name: "metric_multi" + labels: + label1: "$1" + label2: "$2" + label3: "$3" + label4: "$4" + label5: "$5" + label6: "$6" + label7: "$7" + label8: "$8" + label9: "$9" + label10: "$10" + label11: "$11" + label12: "$12" + ` + mappings := []string{ + "metric.a.b.c.d.e.f.g.h.i.j.k.l", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegexMultipleCapturesDifferentLabels(b *testing.B) { + config := `--- +mappings: +- match: metric\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)\.([^.]*) + name: "metric_multi" + match_type: regex + labels: + label1: "$1" + label2: "$2" + label3: "$3" + label4: "$4" + label5: "$5" + label6: "$6" + label7: "$7" + label8: "$8" + label9: "$9" + label10: "$10" + label11: "$11" + label12: "$12" + ` + mappings := []string{ + "metric.a.b.c.d.e.f.g.h.i.j.k.l", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlob10Rules(b *testing.B) { + config := `--- +mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) + mappings := []string{ + "metric100.a", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlob10RulesCached(b *testing.B) { + config := `--- +mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) + mappings := []string{ + "metric100.a", + } + + for _, cacheType := range []string{"lru", "random"} { + b.Run(cacheType, func(b *testing.B) { + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } + }) + } +} + +func BenchmarkRegex10RulesAverage(b *testing.B) { + config := `--- +defaults: + match_type: regex +mappings:` + duplicateRules(10, ruleTemplateSingleMatchRegex) + mappings := []string{ + "metric5.a", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegex10RulesAverageCached(b *testing.B) { + config := `--- +defaults: + match_type: regex +mappings:` + duplicateRules(10, ruleTemplateSingleMatchRegex) + mappings := []string{ + "metric5.a", + } + + for _, cacheType := range []string{"lru", "random"} { + b.Run(cacheType, func(b *testing.B) { + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } + }) + } +} + +func BenchmarkGlob100Rules(b *testing.B) { + config := `--- +mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) + mappings := []string{ + "metric100.a", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlob100RulesCached(b *testing.B) { + config := `--- +mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) + mappings := []string{ + "metric100.a", + } + + for _, cacheType := range []string{"lru", "random"} { + b.Run(cacheType, func(b *testing.B) { + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } + }) + } +} + +func BenchmarkGlob100RulesNoMatch(b *testing.B) { + config := `--- +mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) + mappings := []string{ + "metricnomatchy.a", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlob100RulesNoOrderingNoMatch(b *testing.B) { + config := `--- +defaults: + glob_disable_ordering: true +mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) + mappings := []string{ + "metricnomatchy.a", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegex100RulesAverage(b *testing.B) { + config := `--- +defaults: + match_type: regex +mappings:` + duplicateRules(100, ruleTemplateSingleMatchRegex) + mappings := []string{ + "metric50.a", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegex100RulesWorst(b *testing.B) { + config := `--- +defaults: + match_type: regex +mappings:` + duplicateRules(100, ruleTemplateSingleMatchRegex) + mappings := []string{ + "metric100.a", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlob100RulesMultipleCaptures(b *testing.B) { + config := `--- +mappings:` + duplicateRules(100, ruleTemplateMultipleMatchGlob) + mappings := []string{ + "metric50.a.b.c.d.e.f.g.h.i.j.k.l", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkGlob100RulesMultipleCapturesCached(b *testing.B) { + config := `--- +mappings:` + duplicateRules(100, ruleTemplateMultipleMatchGlob) + mappings := []string{ + "metric50.a.b.c.d.e.f.g.h.i.j.k.l", + } + + for _, cacheType := range []string{"lru", "random"} { + b.Run(cacheType, func(b *testing.B) { + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } + }) + } +} + +func BenchmarkRegex100RulesMultipleCapturesAverage(b *testing.B) { + config := `--- +defaults: + match_type: regex +mappings:` + duplicateRules(100, ruleTemplateMultipleMatchRegex) + mappings := []string{ + "metric50.a.b.c.d.e.f.g.h.i.j.k.l", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegex100RulesMultipleCapturesWorst(b *testing.B) { + config := `--- +defaults: + match_type: regex +mappings:` + duplicateRules(100, ruleTemplateMultipleMatchRegex) + mappings := []string{ + "metric100.a.b.c.d.e.f.g.h.i.j.k.l", + } + + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } +} + +func BenchmarkRegex100RulesMultipleCapturesWorstCached(b *testing.B) { + config := `--- +defaults: + match_type: regex +mappings:` + duplicateRules(100, ruleTemplateMultipleMatchRegex) + mappings := []string{ + "metric100.a.b.c.d.e.f.g.h.i.j.k.l", + } + + for _, cacheType := range []string{"lru", "random"} { + b.Run(cacheType, func(b *testing.B) { + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } + }) + } +} + +func duplicateMetrics(count int, template string) []string { + var out []string + for i := 0; i < count; i++ { + out = append(out, fmt.Sprintf(template, i)) + } + return out +} + +func BenchmarkGlob100RulesCached100Metrics(b *testing.B) { + config := `--- +mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) + + mappings := duplicateMetrics(100, "metric100") + + for _, cacheType := range []string{"lru", "random"} { + b.Run(cacheType, func(b *testing.B) { + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 1000, WithCacheType(cacheType)) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } + }) + } +} + +func BenchmarkGlob100RulesCached100MetricsSmallCache(b *testing.B) { + // This benchmark is the worst case for the LRU cache. + // The cache is smaller than the total number of metrics and + // we iterate linearly through the metrics, so we will + // constantly evict cache entries. + config := `--- +mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) + + mappings := duplicateMetrics(100, "metric100") + + for _, cacheType := range []string{"lru", "random"} { + b.Run(cacheType, func(b *testing.B) { + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 50, WithCacheType(cacheType)) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } + }) + } +} + +func BenchmarkGlob100RulesCached100MetricsRandomSmallCache(b *testing.B) { + // Slighly more realistic benchmark with a smaller cache. + // Randomly match metrics so we should have some cache hits. + config := `--- +mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob) + + base := duplicateMetrics(100, "metric100") + var mappings []string + for i := 0; i < 10; i++ { + mappings = append(mappings, base...) + } + + r := rand.New(rand.NewSource(42)) + r.Shuffle(len(mappings), func(i, j int) { + mappings[i], mappings[j] = mappings[j], mappings[i] + }) + + for _, cacheType := range []string{"lru", "random"} { + b.Run(cacheType, func(b *testing.B) { + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 50, WithCacheType(cacheType)) + if err != nil { + b.Fatalf("Config load error: %s %s", config, err) + } + + b.ResetTimer() + for j := 0; j < b.N; j++ { + for _, metric := range mappings { + mapper.GetMapping(metric, MetricTypeCounter) + } + } + }) + } +} diff --git a/pkg/mapper/mapper_cache.go b/pkg/mapper/mapper_cache.go index 5b252a7..db127a7 100644 --- a/pkg/mapper/mapper_cache.go +++ b/pkg/mapper/mapper_cache.go @@ -1,198 +1,198 @@ -// Copyright 2019 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import ( - "sync" - - lru "github.com/hashicorp/golang-lru" - "github.com/prometheus/client_golang/prometheus" -) - -var ( - cacheLength = prometheus.NewGauge( - prometheus.GaugeOpts{ - Name: "statsd_metric_mapper_cache_length", - Help: "The count of unique metrics currently cached.", - }, - ) - cacheGetsTotal = prometheus.NewCounter( - prometheus.CounterOpts{ - Name: "statsd_metric_mapper_cache_gets_total", - Help: "The count of total metric cache gets.", - }, - ) - cacheHitsTotal = prometheus.NewCounter( - prometheus.CounterOpts{ - Name: "statsd_metric_mapper_cache_hits_total", - Help: "The count of total metric cache hits.", - }, - ) -) - -type cacheOptions struct { - cacheType string -} - -type CacheOption func(*cacheOptions) - -func WithCacheType(cacheType string) CacheOption { - return func(o *cacheOptions) { - o.cacheType = cacheType - } -} - -type MetricMapperCacheResult struct { - Mapping *MetricMapping - Matched bool - Labels prometheus.Labels -} - -type MetricMapperCache interface { - Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) - AddMatch(metricString string, metricType MetricType, mapping *MetricMapping, labels prometheus.Labels) - AddMiss(metricString string, metricType MetricType) -} - -type MetricMapperLRUCache struct { - MetricMapperCache - cache *lru.Cache -} - -type MetricMapperNoopCache struct { - MetricMapperCache -} - -func NewMetricMapperCache(size int) (*MetricMapperLRUCache, error) { - cacheLength.Set(0) - cache, err := lru.New(size) - if err != nil { - return &MetricMapperLRUCache{}, err - } - return &MetricMapperLRUCache{cache: cache}, nil -} - -func (m *MetricMapperLRUCache) Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) { - cacheGetsTotal.Inc() - if result, ok := m.cache.Get(formatKey(metricString, metricType)); ok { - cacheHitsTotal.Inc() - return result.(*MetricMapperCacheResult), true - } else { - return nil, false - } -} - -func (m *MetricMapperLRUCache) AddMatch(metricString string, metricType MetricType, mapping *MetricMapping, labels prometheus.Labels) { - go m.trackCacheLength() - m.cache.Add(formatKey(metricString, metricType), &MetricMapperCacheResult{Mapping: mapping, Matched: true, Labels: labels}) -} - -func (m *MetricMapperLRUCache) AddMiss(metricString string, metricType MetricType) { - go m.trackCacheLength() - m.cache.Add(formatKey(metricString, metricType), &MetricMapperCacheResult{Matched: false}) -} - -func (m *MetricMapperLRUCache) trackCacheLength() { - cacheLength.Set(float64(m.cache.Len())) -} - -func formatKey(metricString string, metricType MetricType) string { - return string(metricType) + "." + metricString -} - -func NewMetricMapperNoopCache() *MetricMapperNoopCache { - cacheLength.Set(0) - return &MetricMapperNoopCache{} -} - -func (m *MetricMapperNoopCache) Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) { - return nil, false -} - -func (m *MetricMapperNoopCache) AddMatch(metricString string, metricType MetricType, mapping *MetricMapping, labels prometheus.Labels) { - return -} - -func (m *MetricMapperNoopCache) AddMiss(metricString string, metricType MetricType) { - return -} - -type MetricMapperRRCache struct { - MetricMapperCache - lock sync.RWMutex - size int - items map[string]*MetricMapperCacheResult -} - -func NewMetricMapperRRCache(size int) (*MetricMapperRRCache, error) { - cacheLength.Set(0) - c := &MetricMapperRRCache{ - items: make(map[string]*MetricMapperCacheResult, size+1), - size: size, - } - return c, nil -} - -func (m *MetricMapperRRCache) Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) { - key := formatKey(metricString, metricType) - - m.lock.RLock() - result, ok := m.items[key] - m.lock.RUnlock() - - return result, ok -} - -func (m *MetricMapperRRCache) addItem(metricString string, metricType MetricType, result *MetricMapperCacheResult) { - go m.trackCacheLength() - - key := formatKey(metricString, metricType) - - m.lock.Lock() - - m.items[key] = result - - // evict an item if needed - if len(m.items) > m.size { - for k := range m.items { - delete(m.items, k) - break - } - } - - m.lock.Unlock() -} - -func (m *MetricMapperRRCache) AddMatch(metricString string, metricType MetricType, mapping *MetricMapping, labels prometheus.Labels) { - e := &MetricMapperCacheResult{Mapping: mapping, Matched: true, Labels: labels} - m.addItem(metricString, metricType, e) -} - -func (m *MetricMapperRRCache) AddMiss(metricString string, metricType MetricType) { - e := &MetricMapperCacheResult{Matched: false} - m.addItem(metricString, metricType, e) -} - -func (m *MetricMapperRRCache) trackCacheLength() { - m.lock.RLock() - length := len(m.items) - m.lock.RUnlock() - cacheLength.Set(float64(length)) -} - -func init() { - prometheus.MustRegister(cacheLength) - prometheus.MustRegister(cacheGetsTotal) - prometheus.MustRegister(cacheHitsTotal) -} +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import ( + "sync" + + lru "github.com/hashicorp/golang-lru" + "github.com/prometheus/client_golang/prometheus" +) + +var ( + cacheLength = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "statsd_metric_mapper_cache_length", + Help: "The count of unique metrics currently cached.", + }, + ) + cacheGetsTotal = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_metric_mapper_cache_gets_total", + Help: "The count of total metric cache gets.", + }, + ) + cacheHitsTotal = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "statsd_metric_mapper_cache_hits_total", + Help: "The count of total metric cache hits.", + }, + ) +) + +type cacheOptions struct { + cacheType string +} + +type CacheOption func(*cacheOptions) + +func WithCacheType(cacheType string) CacheOption { + return func(o *cacheOptions) { + o.cacheType = cacheType + } +} + +type MetricMapperCacheResult struct { + Mapping *MetricMapping + Matched bool + Labels prometheus.Labels +} + +type MetricMapperCache interface { + Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) + AddMatch(metricString string, metricType MetricType, mapping *MetricMapping, labels prometheus.Labels) + AddMiss(metricString string, metricType MetricType) +} + +type MetricMapperLRUCache struct { + MetricMapperCache + cache *lru.Cache +} + +type MetricMapperNoopCache struct { + MetricMapperCache +} + +func NewMetricMapperCache(size int) (*MetricMapperLRUCache, error) { + cacheLength.Set(0) + cache, err := lru.New(size) + if err != nil { + return &MetricMapperLRUCache{}, err + } + return &MetricMapperLRUCache{cache: cache}, nil +} + +func (m *MetricMapperLRUCache) Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) { + cacheGetsTotal.Inc() + if result, ok := m.cache.Get(formatKey(metricString, metricType)); ok { + cacheHitsTotal.Inc() + return result.(*MetricMapperCacheResult), true + } else { + return nil, false + } +} + +func (m *MetricMapperLRUCache) AddMatch(metricString string, metricType MetricType, mapping *MetricMapping, labels prometheus.Labels) { + go m.trackCacheLength() + m.cache.Add(formatKey(metricString, metricType), &MetricMapperCacheResult{Mapping: mapping, Matched: true, Labels: labels}) +} + +func (m *MetricMapperLRUCache) AddMiss(metricString string, metricType MetricType) { + go m.trackCacheLength() + m.cache.Add(formatKey(metricString, metricType), &MetricMapperCacheResult{Matched: false}) +} + +func (m *MetricMapperLRUCache) trackCacheLength() { + cacheLength.Set(float64(m.cache.Len())) +} + +func formatKey(metricString string, metricType MetricType) string { + return string(metricType) + "." + metricString +} + +func NewMetricMapperNoopCache() *MetricMapperNoopCache { + cacheLength.Set(0) + return &MetricMapperNoopCache{} +} + +func (m *MetricMapperNoopCache) Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) { + return nil, false +} + +func (m *MetricMapperNoopCache) AddMatch(metricString string, metricType MetricType, mapping *MetricMapping, labels prometheus.Labels) { + return +} + +func (m *MetricMapperNoopCache) AddMiss(metricString string, metricType MetricType) { + return +} + +type MetricMapperRRCache struct { + MetricMapperCache + lock sync.RWMutex + size int + items map[string]*MetricMapperCacheResult +} + +func NewMetricMapperRRCache(size int) (*MetricMapperRRCache, error) { + cacheLength.Set(0) + c := &MetricMapperRRCache{ + items: make(map[string]*MetricMapperCacheResult, size+1), + size: size, + } + return c, nil +} + +func (m *MetricMapperRRCache) Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) { + key := formatKey(metricString, metricType) + + m.lock.RLock() + result, ok := m.items[key] + m.lock.RUnlock() + + return result, ok +} + +func (m *MetricMapperRRCache) addItem(metricString string, metricType MetricType, result *MetricMapperCacheResult) { + go m.trackCacheLength() + + key := formatKey(metricString, metricType) + + m.lock.Lock() + + m.items[key] = result + + // evict an item if needed + if len(m.items) > m.size { + for k := range m.items { + delete(m.items, k) + break + } + } + + m.lock.Unlock() +} + +func (m *MetricMapperRRCache) AddMatch(metricString string, metricType MetricType, mapping *MetricMapping, labels prometheus.Labels) { + e := &MetricMapperCacheResult{Mapping: mapping, Matched: true, Labels: labels} + m.addItem(metricString, metricType, e) +} + +func (m *MetricMapperRRCache) AddMiss(metricString string, metricType MetricType) { + e := &MetricMapperCacheResult{Matched: false} + m.addItem(metricString, metricType, e) +} + +func (m *MetricMapperRRCache) trackCacheLength() { + m.lock.RLock() + length := len(m.items) + m.lock.RUnlock() + cacheLength.Set(float64(length)) +} + +func init() { + prometheus.MustRegister(cacheLength) + prometheus.MustRegister(cacheGetsTotal) + prometheus.MustRegister(cacheHitsTotal) +} diff --git a/pkg/mapper/mapper_test.go b/pkg/mapper/mapper_test.go index dc8a45d..c3748bf 100644 --- a/pkg/mapper/mapper_test.go +++ b/pkg/mapper/mapper_test.go @@ -1,1032 +1,1032 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import ( - "testing" - "time" -) - -type mappings []struct { - statsdMetric string - name string - labels map[string]string - quantiles []metricObjective - notPresent bool - ttl time.Duration - metricType MetricType - maxAge time.Duration - ageBuckets uint32 - bufCap uint32 -} - -func TestMetricMapperYAML(t *testing.T) { - scenarios := []struct { - config string - configBad bool - mappings mappings - }{ - // Empty config. - {}, - // Config with several mapping definitions. - { - config: `--- -mappings: -- match: test.dispatcher.*.*.* - name: "dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "$3" - job: "test_dispatcher" -- match: test.my-dispatch-host01.name.dispatcher.*.*.* - name: "host_dispatch_events" - labels: - processor: "$1" - action: "$2" - result: "$3" - job: "test_dispatcher" -- match: request_time.*.*.*.*.*.*.*.*.*.*.*.* - name: "tyk_http_request" - labels: - method_and_path: "${1}" - response_code: "${2}" - apikey: "${3}" - apiversion: "${4}" - apiname: "${5}" - apiid: "${6}" - ipv4_t1: "${7}" - ipv4_t2: "${8}" - ipv4_t3: "${9}" - ipv4_t4: "${10}" - orgid: "${11}" - oauthid: "${12}" -- match: "*.*" - name: "catchall" - labels: - first: "$1" - second: "$2" - third: "$3" - job: "$1-$2-$3" -- match: (.*)\.(.*)-(.*)\.(.*) - match_type: regex - name: "proxy_requests_total" - labels: - job: "$1" - protocol: "$2" - endpoint: "$3" - result: "$4" - - `, - mappings: mappings{ - { - statsdMetric: "test.dispatcher.FooProcessor.send.succeeded", - name: "dispatch_events", - labels: map[string]string{ - "processor": "FooProcessor", - "action": "send", - "result": "succeeded", - "job": "test_dispatcher", - }, - }, - { - statsdMetric: "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", - name: "host_dispatch_events", - labels: map[string]string{ - "processor": "FooProcessor", - "action": "send", - "result": "succeeded", - "job": "test_dispatcher", - }, - }, - { - statsdMetric: "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", - name: "tyk_http_request", - labels: map[string]string{ - "method_and_path": "get/threads/1/posts", - "response_code": "200", - "apikey": "00000000", - "apiversion": "nonversioned", - "apiname": "discussions", - "apiid": "a11bbcdf0ac64ec243658dc64b7100fb", - "ipv4_t1": "172", - "ipv4_t2": "20", - "ipv4_t3": "0", - "ipv4_t4": "1", - "orgid": "12ba97b7eaa1a50001000001", - "oauthid": "", - }, - }, - { - statsdMetric: "foo.bar", - name: "catchall", - labels: map[string]string{ - "first": "foo", - "second": "bar", - "third": "", - "job": "foo-bar-", - }, - }, - { - statsdMetric: "foo.bar.baz", - }, - { - statsdMetric: "proxy-1.http-goober.success", - name: "proxy_requests_total", - labels: map[string]string{ - "job": "proxy-1", - "protocol": "http", - "endpoint": "goober", - "result": "success", - }, - }, - }, - }, - //Config with backtracking - { - config: ` -defaults: - glob_disable_ordering: true -mappings: -- match: backtrack.*.bbb - name: "testb" - labels: - label: "${1}_foo" -- match: backtrack.justatest.aaa - name: "testa" - labels: - label: "${1}_foo" - `, - mappings: mappings{ - { - statsdMetric: "backtrack.good.bbb", - name: "testb", - labels: map[string]string{ - "label": "good_foo", - }, - }, - { - statsdMetric: "backtrack.justatest.bbb", - name: "testb", - labels: map[string]string{ - "label": "justatest_foo", - }, - }, - { - statsdMetric: "backtrack.justatest.aaa", - name: "testa", - labels: map[string]string{ - "label": "_foo", - }, - }, - }, - }, - //Config with backtracking, the non-matched rule has star(s) - // A metric like full.name.anothertest will first match full.name.* and then tries - // to match *.dummy.* and then failed. - // This test case makes sure the captures in the non-matched later rule - // doesn't affect the captures in the first matched rule. - { - config: ` -defaults: - glob_disable_ordering: false -mappings: -- match: '*.dummy.*' - name: metric_one - labels: - system: $1 - attribute: $2 -- match: 'full.name.*' - name: metric_two - labels: - system: static - attribute: $1 -`, - mappings: mappings{ - { - statsdMetric: "whatever.dummy.test", - name: "metric_one", - labels: map[string]string{ - "system": "whatever", - "attribute": "test", - }, - }, - { - statsdMetric: "full.name.anothertest", - name: "metric_two", - labels: map[string]string{ - "system": "static", - "attribute": "anothertest", - }, - }, - }, - }, - //Config with super sets, disables ordering - { - config: ` -defaults: - glob_disable_ordering: true -mappings: -- match: noorder.*.* - name: "testa" - labels: - label: "${1}_foo" -- match: noorder.*.bbb - name: "testb" - labels: - label: "${1}_foo" -- match: noorder.ccc.bbb - name: "testc" - labels: - label: "ccc_foo" - `, - mappings: mappings{ - { - statsdMetric: "noorder.good.bbb", - name: "testb", - labels: map[string]string{ - "label": "good_foo", - }, - }, - { - statsdMetric: "noorder.ccc.bbb", - name: "testc", - labels: map[string]string{ - "label": "ccc_foo", - }, - }, - }, - }, - //Config with super sets, keeps ordering - { - config: ` -defaults: - glob_disable_ordering: false -mappings: -- match: order.*.* - name: "testa" - labels: - label: "${1}_foo" -- match: order.*.bbb - name: "testb" - labels: - label: "${1}_foo" - `, - mappings: mappings{ - { - statsdMetric: "order.good.bbb", - name: "testa", - labels: map[string]string{ - "label": "good_foo", - }, - }, - }, - }, - // Config with bad regex reference. - { - config: `--- -mappings: -- match: test.* - name: "name" - labels: - label: "$1_foo" - `, - mappings: mappings{ - { - statsdMetric: "test.a", - name: "name", - labels: map[string]string{ - "label": "", - }, - }, - }, - }, - // Config with good regex reference. - { - config: ` -mappings: -- match: test.* - name: "name" - labels: - label: "${1}_foo" - `, - mappings: mappings{ - { - statsdMetric: "test.a", - name: "name", - labels: map[string]string{ - "label": "a_foo", - }, - }, - }, - }, - // Config with bad metric line. - { - config: `--- -mappings: -- match: bad--metric-line.*.* - name: "foo" - labels: {} - `, - configBad: true, - }, - // Config with dynamic metric name. - { - config: `--- -mappings: -- match: test1.*.* - name: "$1" - labels: {} -- match: test2.*.* - name: "${1}_$2" - labels: {} -- match: test3\.(\w+)\.(\w+) - match_type: regex - name: "${2}_$1" - labels: {} - `, - mappings: mappings{ - { - statsdMetric: "test1.total_requests.count", - name: "total_requests", - }, - { - statsdMetric: "test2.total_requests.count", - name: "total_requests_count", - }, - { - statsdMetric: "test3.total_requests.count", - name: "count_total_requests", - }, - }, - }, - // Config with bad metric name. - { - config: `--- -mappings: -- match: test.*.* - name: "0foo" - labels: {} - `, - configBad: true, - }, - // Config with no metric name. - { - config: `--- -mappings: -- match: test.*.* - labels: - this: "$1" - `, - configBad: true, - }, - // Config with no mappings. - { - config: ``, - mappings: mappings{}, - }, - // Config without a trailing newline. - { - config: `mappings: -- match: test.* - name: "name" - labels: - label: "${1}_foo"`, - mappings: mappings{ - { - statsdMetric: "test.a", - name: "name", - labels: map[string]string{ - "label": "a_foo", - }, - }, - }, - }, - // Config with an improperly escaped *. - { - config: ` -mappings: -- match: *.test.* - name: "name" - labels: - label: "${1}_foo"`, - configBad: true, - }, - // Config with a properly escaped *. - { - config: ` -mappings: -- match: "*.test.*" - name: "name" - labels: - label: "${2}_foo"`, - mappings: mappings{ - { - statsdMetric: "foo.test.a", - name: "name", - labels: map[string]string{ - "label": "a_foo", - }, - }, - }, - }, - // Config with good timer type. - { - config: `--- -mappings: -- match: test.*.* - timer_type: summary - name: "foo" - labels: {} - quantiles: - - quantile: 0.42 - error: 0.04 - - quantile: 0.7 - error: 0.002 - `, - mappings: mappings{ - { - statsdMetric: "test.*.*", - name: "foo", - labels: map[string]string{}, - quantiles: []metricObjective{ - {Quantile: 0.42, Error: 0.04}, - {Quantile: 0.7, Error: 0.002}, - }, - }, - }, - }, - { - config: `--- -mappings: -- match: test1.*.* - timer_type: summary - name: "foo" - labels: {} - `, - mappings: mappings{ - { - statsdMetric: "test1.*.*", - name: "foo", - labels: map[string]string{}, - quantiles: []metricObjective{ - {Quantile: 0.5, Error: 0.05}, - {Quantile: 0.9, Error: 0.01}, - {Quantile: 0.99, Error: 0.001}, - }, - }, - }, - }, - // Config with bad timer type. - { - config: `--- -mappings: -- match: test.*.* - timer_type: wrong - name: "foo" - labels: {} - `, - configBad: true, - }, - // new style quantiles - { - config: `--- -mappings: -- match: test.*.* - timer_type: summary - name: "foo" - labels: {} - summary_options: - quantiles: - - quantile: 0.42 - error: 0.04 - - quantile: 0.7 - error: 0.002 - `, - mappings: mappings{ - { - statsdMetric: "test.*.*", - name: "foo", - labels: map[string]string{}, - quantiles: []metricObjective{ - {Quantile: 0.42, Error: 0.04}, - {Quantile: 0.7, Error: 0.002}, - }, - }, - }, - }, - // Config with summary configuration. - { - config: `--- -mappings: -- match: test.*.* - timer_type: summary - name: "foo" - labels: {} - summary_options: - quantiles: - - quantile: 0.42 - error: 0.04 - - quantile: 0.7 - error: 0.002 - max_age: 5m - age_buckets: 2 - buf_cap: 1000 - `, - mappings: mappings{ - { - statsdMetric: "test.*.*", - name: "foo", - labels: map[string]string{}, - quantiles: []metricObjective{ - {Quantile: 0.42, Error: 0.04}, - {Quantile: 0.7, Error: 0.002}, - }, - maxAge: 5 * time.Minute, - ageBuckets: 2, - bufCap: 1000, - }, - }, - }, - // duplicate quantiles are bad - { - config: `--- -mappings: -- match: test.*.* - timer_type: summary - name: "foo" - labels: {} - quantiles: - - quantile: 0.42 - error: 0.04 - summary_options: - quantiles: - - quantile: 0.42 - error: 0.04 - `, - configBad: true, - }, - // Config with good metric type. - { - config: `--- -mappings: -- match: test.*.* - match_metric_type: counter - name: "foo" - labels: {} - `, - }, - // Config with bad metric type matcher. - { - config: `--- -mappings: -- match: test.*.* - match_metric_type: wrong - name: "foo" - labels: {} - `, - configBad: true, - }, - // Config with multiple explicit metric types - { - config: `--- -mappings: -- match: test.foo.* - name: "test_foo_sum" - match_metric_type: counter -- match: test.foo.* - name: "test_foo_current" - match_metric_type: gauge - `, - mappings: mappings{ - { - statsdMetric: "test.foo.test", - name: "test_foo_sum", - metricType: MetricTypeCounter, - }, - { - statsdMetric: "test.foo.test", - name: "test_foo_current", - metricType: MetricTypeGauge, - }, - }, - }, - //Config with uncompilable regex. - { - config: `--- -mappings: -- match: "*\\.foo" - match_type: regex - name: "foo" - labels: {} - `, - configBad: true, - }, - //Config with non-matched metric. - { - config: `--- -mappings: -- match: foo.*.* - timer_type: summary - name: "foo" - labels: {} - `, - mappings: mappings{ - { - statsdMetric: "test.1.2", - name: "test_1_2", - labels: map[string]string{}, - notPresent: true, - }, - }, - }, - //Config with no name. - { - config: `--- -mappings: -- match: *\.foo - match_type: regex - labels: - bar: "foo" - `, - configBad: true, - }, - // Example from the README. - { - config: ` -mappings: -- match: test.dispatcher.*.*.* - name: "dispatcher_events_total" - labels: - processor: "$1" - action: "$2" - outcome: "$3" - job: "test_dispatcher" -- match: "*.signup.*.*" - name: "signup_events_total" - labels: - provider: "$2" - outcome: "$3" - job: "${1}_server" -`, - mappings: mappings{ - { - statsdMetric: "test.dispatcher.FooProcessor.send.success", - name: "dispatcher_events_total", - labels: map[string]string{ - "processor": "FooProcessor", - "action": "send", - "outcome": "success", - "job": "test_dispatcher", - }, - }, - { - statsdMetric: "foo_product.signup.facebook.failure", - name: "signup_events_total", - labels: map[string]string{ - "provider": "facebook", - "outcome": "failure", - "job": "foo_product_server", - }, - }, - { - statsdMetric: "test.web-server.foo.bar", - name: "test_web_server_foo_bar", - labels: map[string]string{}, - }, - }, - }, - // Config that drops all. - { - config: `mappings: -- match: . - match_type: regex - name: "drop" - action: drop`, - mappings: mappings{ - { - statsdMetric: "test.a", - }, - { - statsdMetric: "abc", - }, - }, - }, - // Config that has a catch-all to drop all. - { - config: `mappings: -- match: web.* - name: "web" - labels: - site: "$1" -- match: . - match_type: regex - name: "drop" - action: drop`, - mappings: mappings{ - { - statsdMetric: "test.a", - }, - { - statsdMetric: "web.localhost", - name: "web", - labels: map[string]string{ - "site": "localhost", - }, - }, - }, - }, - // Config that has a ttl. - { - config: `mappings: -- match: web.* - name: "web" - ttl: 10s - labels: - site: "$1"`, - mappings: mappings{ - { - statsdMetric: "test.a", - }, - { - statsdMetric: "web.localhost", - name: "web", - labels: map[string]string{ - "site": "localhost", - }, - ttl: time.Second * 10, - }, - }, - }, - // Config that has a default ttl. - { - config: `defaults: - ttl: 1m2s -mappings: -- match: web.* - name: "web" - labels: - site: "$1"`, - mappings: mappings{ - { - statsdMetric: "test.a", - }, - { - statsdMetric: "web.localhost", - name: "web", - labels: map[string]string{ - "site": "localhost", - }, - ttl: time.Minute + time.Second*2, - }, - }, - }, - // Config that override a default ttl. - { - config: `defaults: - ttl: 1m2s -mappings: -- match: web.* - name: "web" - ttl: 5s - labels: - site: "$1"`, - mappings: mappings{ - { - statsdMetric: "test.a", - }, - { - statsdMetric: "web.localhost", - name: "web", - labels: map[string]string{ - "site": "localhost", - }, - ttl: time.Second * 5, - }, - }, - }, - } - - mapper := MetricMapper{} - for i, scenario := range scenarios { - err := mapper.InitFromYAMLString(scenario.config, 1000) - if err != nil && !scenario.configBad { - t.Fatalf("%d. Config load error: %s %s", i, scenario.config, err) - } - if err == nil && scenario.configBad { - t.Fatalf("%d. Expected bad config, but loaded ok: %s", i, scenario.config) - } - - for metric, mapping := range scenario.mappings { - // exporter will call mapper.GetMapping with valid MetricType - // so we also pass a sane MetricType in testing if it's not specified - mapType := mapping.metricType - if mapType == "" { - mapType = MetricTypeCounter - } - m, labels, present := mapper.GetMapping(mapping.statsdMetric, mapType) - if present && mapping.name != "" && m.Name != mapping.name { - t.Fatalf("%d.%q: Expected name %v, got %v", i, metric, m.Name, mapping.name) - } - if mapping.notPresent && present { - t.Fatalf("%d.%q: Expected metric to not be present", i, metric) - } - if len(labels) != len(mapping.labels) { - t.Fatalf("%d.%q: Expected %d labels, got %d", i, metric, len(mapping.labels), len(labels)) - } - for label, value := range labels { - if mapping.labels[label] != value { - t.Fatalf("%d.%q: Expected labels %v, got %v", i, metric, mapping, labels) - } - } - if mapping.ttl > 0 && mapping.ttl != m.Ttl { - t.Fatalf("%d.%q: Expected ttl of %s, got %s", i, metric, mapping.ttl.String(), m.Ttl.String()) - } - if mapping.metricType != "" && mapType != m.MatchMetricType { - t.Fatalf("%d.%q: Expected match metric of %s, got %s", i, metric, mapType, m.MatchMetricType) - } - - if len(mapping.quantiles) != 0 { - if len(mapping.quantiles) != len(m.SummaryOptions.Quantiles) { - t.Fatalf("%d.%q: Expected %d quantiles, got %d", i, metric, len(mapping.quantiles), len(m.SummaryOptions.Quantiles)) - } - for i, quantile := range mapping.quantiles { - if quantile.Quantile != m.SummaryOptions.Quantiles[i].Quantile { - t.Fatalf("%d.%q: Expected quantile %v, got %v", i, metric, m.SummaryOptions.Quantiles[i].Quantile, quantile.Quantile) - } - if quantile.Error != m.SummaryOptions.Quantiles[i].Error { - t.Fatalf("%d.%q: Expected Error margin %v, got %v", i, metric, m.SummaryOptions.Quantiles[i].Error, quantile.Error) - } - } - } - if mapping.maxAge != 0 && mapping.maxAge != m.SummaryOptions.MaxAge { - t.Fatalf("%d.%q: Expected max age %v, got %v", i, metric, mapping.maxAge, m.SummaryOptions.MaxAge) - } - if mapping.ageBuckets != 0 && mapping.ageBuckets != m.SummaryOptions.AgeBuckets { - t.Fatalf("%d.%q: Expected max age %v, got %v", i, metric, mapping.ageBuckets, m.SummaryOptions.AgeBuckets) - } - if mapping.bufCap != 0 && mapping.bufCap != m.SummaryOptions.BufCap { - t.Fatalf("%d.%q: Expected max age %v, got %v", i, metric, mapping.bufCap, m.SummaryOptions.BufCap) - } - } - } -} - -func TestAction(t *testing.T) { - scenarios := []struct { - config string - configBad bool - expectedAction ActionType - }{ - { - // no action set - config: `--- -mappings: -- match: test.*.* - name: "foo" -`, - configBad: false, - expectedAction: ActionTypeMap, - }, - { - // map action set - config: `--- -mappings: -- match: test.*.* - name: "foo" - action: map -`, - configBad: false, - expectedAction: ActionTypeMap, - }, - { - // drop action set - config: `--- -mappings: -- match: test.*.* - name: "foo" - action: drop -`, - configBad: false, - expectedAction: ActionTypeDrop, - }, - { - // invalid action set - config: `--- -mappings: -- match: test.*.* - name: "foo" - action: xyz -`, - configBad: true, - expectedAction: ActionTypeDrop, - }, - { - // valid yaml example - config: `--- -mappings: -- match: "test\\.(\\w+)\\.(\\w+)\\.counter" - match_type: regex - name: "${2}_total" - labels: - provider: "$1" -`, - configBad: false, - expectedAction: ActionTypeMap, - }, - { - // invalid yaml example - config: `--- -mappings: -- match: "test\.(\w+)\.(\w+)\.counter" - match_type: regex - name: "${2}_total" - labels: - provider: "$1" -`, - configBad: true, - }, - } - - for i, scenario := range scenarios { - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(scenario.config, 0) - if err != nil && !scenario.configBad { - t.Fatalf("%d. Config load error: %s %s", i, scenario.config, err) - } - if err == nil && scenario.configBad { - t.Fatalf("%d. Expected bad config, but loaded ok: %s", i, scenario.config) - } - - if !scenario.configBad { - a := mapper.Mappings[0].Action - if scenario.expectedAction != a { - t.Fatalf("%d: Expected action %v, got %v", i, scenario.expectedAction, a) - } - } - } -} - -// Test for https://github.com/prometheus/statsd_exporter/issues/273 -// Corrupt cache for multiple names matching in fsm -func TestMultipleMatches(t *testing.T) { - config := `--- -mappings: -- match: aa.bb.*.* - name: "aa_bb_${1}_total" - labels: - app: "$2" -` - mapper := MetricMapper{} - err := mapper.InitFromYAMLString(config, 0) - if err != nil { - t.Fatalf("config load error: %s ", err) - } - - names := map[string]string{ - "aa.bb.aa.myapp": "aa_bb_aa_total", - "aa.bb.bb.myapp": "aa_bb_bb_total", - "aa.bb.cc.myapp": "aa_bb_cc_total", - "aa.bb.dd.myapp": "aa_bb_dd_total", - } - - scenarios := []struct { - cacheSize int - }{ - { - cacheSize: 0, - }, - { - cacheSize: len(names), - }, - } - - for i, scenario := range scenarios { - mapper.InitCache(scenario.cacheSize) - - // run multiple times to ensure cache works as expected - for j := 0; j < 10; j++ { - for name, expected := range names { - m, _, ok := mapper.GetMapping(name, MetricTypeCounter) - if !ok { - t.Fatalf("%d:%d Did not find match for %s", i, j, name) - } - if m.Name != expected { - t.Fatalf("%d:%d Expected name %s, got %s", i, j, expected, m.Name) - } - } - } - } - -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import ( + "testing" + "time" +) + +type mappings []struct { + statsdMetric string + name string + labels map[string]string + quantiles []metricObjective + notPresent bool + ttl time.Duration + metricType MetricType + maxAge time.Duration + ageBuckets uint32 + bufCap uint32 +} + +func TestMetricMapperYAML(t *testing.T) { + scenarios := []struct { + config string + configBad bool + mappings mappings + }{ + // Empty config. + {}, + // Config with several mapping definitions. + { + config: `--- +mappings: +- match: test.dispatcher.*.*.* + name: "dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "$3" + job: "test_dispatcher" +- match: test.my-dispatch-host01.name.dispatcher.*.*.* + name: "host_dispatch_events" + labels: + processor: "$1" + action: "$2" + result: "$3" + job: "test_dispatcher" +- match: request_time.*.*.*.*.*.*.*.*.*.*.*.* + name: "tyk_http_request" + labels: + method_and_path: "${1}" + response_code: "${2}" + apikey: "${3}" + apiversion: "${4}" + apiname: "${5}" + apiid: "${6}" + ipv4_t1: "${7}" + ipv4_t2: "${8}" + ipv4_t3: "${9}" + ipv4_t4: "${10}" + orgid: "${11}" + oauthid: "${12}" +- match: "*.*" + name: "catchall" + labels: + first: "$1" + second: "$2" + third: "$3" + job: "$1-$2-$3" +- match: (.*)\.(.*)-(.*)\.(.*) + match_type: regex + name: "proxy_requests_total" + labels: + job: "$1" + protocol: "$2" + endpoint: "$3" + result: "$4" + + `, + mappings: mappings{ + { + statsdMetric: "test.dispatcher.FooProcessor.send.succeeded", + name: "dispatch_events", + labels: map[string]string{ + "processor": "FooProcessor", + "action": "send", + "result": "succeeded", + "job": "test_dispatcher", + }, + }, + { + statsdMetric: "test.my-dispatch-host01.name.dispatcher.FooProcessor.send.succeeded", + name: "host_dispatch_events", + labels: map[string]string{ + "processor": "FooProcessor", + "action": "send", + "result": "succeeded", + "job": "test_dispatcher", + }, + }, + { + statsdMetric: "request_time.get/threads/1/posts.200.00000000.nonversioned.discussions.a11bbcdf0ac64ec243658dc64b7100fb.172.20.0.1.12ba97b7eaa1a50001000001.", + name: "tyk_http_request", + labels: map[string]string{ + "method_and_path": "get/threads/1/posts", + "response_code": "200", + "apikey": "00000000", + "apiversion": "nonversioned", + "apiname": "discussions", + "apiid": "a11bbcdf0ac64ec243658dc64b7100fb", + "ipv4_t1": "172", + "ipv4_t2": "20", + "ipv4_t3": "0", + "ipv4_t4": "1", + "orgid": "12ba97b7eaa1a50001000001", + "oauthid": "", + }, + }, + { + statsdMetric: "foo.bar", + name: "catchall", + labels: map[string]string{ + "first": "foo", + "second": "bar", + "third": "", + "job": "foo-bar-", + }, + }, + { + statsdMetric: "foo.bar.baz", + }, + { + statsdMetric: "proxy-1.http-goober.success", + name: "proxy_requests_total", + labels: map[string]string{ + "job": "proxy-1", + "protocol": "http", + "endpoint": "goober", + "result": "success", + }, + }, + }, + }, + //Config with backtracking + { + config: ` +defaults: + glob_disable_ordering: true +mappings: +- match: backtrack.*.bbb + name: "testb" + labels: + label: "${1}_foo" +- match: backtrack.justatest.aaa + name: "testa" + labels: + label: "${1}_foo" + `, + mappings: mappings{ + { + statsdMetric: "backtrack.good.bbb", + name: "testb", + labels: map[string]string{ + "label": "good_foo", + }, + }, + { + statsdMetric: "backtrack.justatest.bbb", + name: "testb", + labels: map[string]string{ + "label": "justatest_foo", + }, + }, + { + statsdMetric: "backtrack.justatest.aaa", + name: "testa", + labels: map[string]string{ + "label": "_foo", + }, + }, + }, + }, + //Config with backtracking, the non-matched rule has star(s) + // A metric like full.name.anothertest will first match full.name.* and then tries + // to match *.dummy.* and then failed. + // This test case makes sure the captures in the non-matched later rule + // doesn't affect the captures in the first matched rule. + { + config: ` +defaults: + glob_disable_ordering: false +mappings: +- match: '*.dummy.*' + name: metric_one + labels: + system: $1 + attribute: $2 +- match: 'full.name.*' + name: metric_two + labels: + system: static + attribute: $1 +`, + mappings: mappings{ + { + statsdMetric: "whatever.dummy.test", + name: "metric_one", + labels: map[string]string{ + "system": "whatever", + "attribute": "test", + }, + }, + { + statsdMetric: "full.name.anothertest", + name: "metric_two", + labels: map[string]string{ + "system": "static", + "attribute": "anothertest", + }, + }, + }, + }, + //Config with super sets, disables ordering + { + config: ` +defaults: + glob_disable_ordering: true +mappings: +- match: noorder.*.* + name: "testa" + labels: + label: "${1}_foo" +- match: noorder.*.bbb + name: "testb" + labels: + label: "${1}_foo" +- match: noorder.ccc.bbb + name: "testc" + labels: + label: "ccc_foo" + `, + mappings: mappings{ + { + statsdMetric: "noorder.good.bbb", + name: "testb", + labels: map[string]string{ + "label": "good_foo", + }, + }, + { + statsdMetric: "noorder.ccc.bbb", + name: "testc", + labels: map[string]string{ + "label": "ccc_foo", + }, + }, + }, + }, + //Config with super sets, keeps ordering + { + config: ` +defaults: + glob_disable_ordering: false +mappings: +- match: order.*.* + name: "testa" + labels: + label: "${1}_foo" +- match: order.*.bbb + name: "testb" + labels: + label: "${1}_foo" + `, + mappings: mappings{ + { + statsdMetric: "order.good.bbb", + name: "testa", + labels: map[string]string{ + "label": "good_foo", + }, + }, + }, + }, + // Config with bad regex reference. + { + config: `--- +mappings: +- match: test.* + name: "name" + labels: + label: "$1_foo" + `, + mappings: mappings{ + { + statsdMetric: "test.a", + name: "name", + labels: map[string]string{ + "label": "", + }, + }, + }, + }, + // Config with good regex reference. + { + config: ` +mappings: +- match: test.* + name: "name" + labels: + label: "${1}_foo" + `, + mappings: mappings{ + { + statsdMetric: "test.a", + name: "name", + labels: map[string]string{ + "label": "a_foo", + }, + }, + }, + }, + // Config with bad metric line. + { + config: `--- +mappings: +- match: bad--metric-line.*.* + name: "foo" + labels: {} + `, + configBad: true, + }, + // Config with dynamic metric name. + { + config: `--- +mappings: +- match: test1.*.* + name: "$1" + labels: {} +- match: test2.*.* + name: "${1}_$2" + labels: {} +- match: test3\.(\w+)\.(\w+) + match_type: regex + name: "${2}_$1" + labels: {} + `, + mappings: mappings{ + { + statsdMetric: "test1.total_requests.count", + name: "total_requests", + }, + { + statsdMetric: "test2.total_requests.count", + name: "total_requests_count", + }, + { + statsdMetric: "test3.total_requests.count", + name: "count_total_requests", + }, + }, + }, + // Config with bad metric name. + { + config: `--- +mappings: +- match: test.*.* + name: "0foo" + labels: {} + `, + configBad: true, + }, + // Config with no metric name. + { + config: `--- +mappings: +- match: test.*.* + labels: + this: "$1" + `, + configBad: true, + }, + // Config with no mappings. + { + config: ``, + mappings: mappings{}, + }, + // Config without a trailing newline. + { + config: `mappings: +- match: test.* + name: "name" + labels: + label: "${1}_foo"`, + mappings: mappings{ + { + statsdMetric: "test.a", + name: "name", + labels: map[string]string{ + "label": "a_foo", + }, + }, + }, + }, + // Config with an improperly escaped *. + { + config: ` +mappings: +- match: *.test.* + name: "name" + labels: + label: "${1}_foo"`, + configBad: true, + }, + // Config with a properly escaped *. + { + config: ` +mappings: +- match: "*.test.*" + name: "name" + labels: + label: "${2}_foo"`, + mappings: mappings{ + { + statsdMetric: "foo.test.a", + name: "name", + labels: map[string]string{ + "label": "a_foo", + }, + }, + }, + }, + // Config with good timer type. + { + config: `--- +mappings: +- match: test.*.* + timer_type: summary + name: "foo" + labels: {} + quantiles: + - quantile: 0.42 + error: 0.04 + - quantile: 0.7 + error: 0.002 + `, + mappings: mappings{ + { + statsdMetric: "test.*.*", + name: "foo", + labels: map[string]string{}, + quantiles: []metricObjective{ + {Quantile: 0.42, Error: 0.04}, + {Quantile: 0.7, Error: 0.002}, + }, + }, + }, + }, + { + config: `--- +mappings: +- match: test1.*.* + timer_type: summary + name: "foo" + labels: {} + `, + mappings: mappings{ + { + statsdMetric: "test1.*.*", + name: "foo", + labels: map[string]string{}, + quantiles: []metricObjective{ + {Quantile: 0.5, Error: 0.05}, + {Quantile: 0.9, Error: 0.01}, + {Quantile: 0.99, Error: 0.001}, + }, + }, + }, + }, + // Config with bad timer type. + { + config: `--- +mappings: +- match: test.*.* + timer_type: wrong + name: "foo" + labels: {} + `, + configBad: true, + }, + // new style quantiles + { + config: `--- +mappings: +- match: test.*.* + timer_type: summary + name: "foo" + labels: {} + summary_options: + quantiles: + - quantile: 0.42 + error: 0.04 + - quantile: 0.7 + error: 0.002 + `, + mappings: mappings{ + { + statsdMetric: "test.*.*", + name: "foo", + labels: map[string]string{}, + quantiles: []metricObjective{ + {Quantile: 0.42, Error: 0.04}, + {Quantile: 0.7, Error: 0.002}, + }, + }, + }, + }, + // Config with summary configuration. + { + config: `--- +mappings: +- match: test.*.* + timer_type: summary + name: "foo" + labels: {} + summary_options: + quantiles: + - quantile: 0.42 + error: 0.04 + - quantile: 0.7 + error: 0.002 + max_age: 5m + age_buckets: 2 + buf_cap: 1000 + `, + mappings: mappings{ + { + statsdMetric: "test.*.*", + name: "foo", + labels: map[string]string{}, + quantiles: []metricObjective{ + {Quantile: 0.42, Error: 0.04}, + {Quantile: 0.7, Error: 0.002}, + }, + maxAge: 5 * time.Minute, + ageBuckets: 2, + bufCap: 1000, + }, + }, + }, + // duplicate quantiles are bad + { + config: `--- +mappings: +- match: test.*.* + timer_type: summary + name: "foo" + labels: {} + quantiles: + - quantile: 0.42 + error: 0.04 + summary_options: + quantiles: + - quantile: 0.42 + error: 0.04 + `, + configBad: true, + }, + // Config with good metric type. + { + config: `--- +mappings: +- match: test.*.* + match_metric_type: counter + name: "foo" + labels: {} + `, + }, + // Config with bad metric type matcher. + { + config: `--- +mappings: +- match: test.*.* + match_metric_type: wrong + name: "foo" + labels: {} + `, + configBad: true, + }, + // Config with multiple explicit metric types + { + config: `--- +mappings: +- match: test.foo.* + name: "test_foo_sum" + match_metric_type: counter +- match: test.foo.* + name: "test_foo_current" + match_metric_type: gauge + `, + mappings: mappings{ + { + statsdMetric: "test.foo.test", + name: "test_foo_sum", + metricType: MetricTypeCounter, + }, + { + statsdMetric: "test.foo.test", + name: "test_foo_current", + metricType: MetricTypeGauge, + }, + }, + }, + //Config with uncompilable regex. + { + config: `--- +mappings: +- match: "*\\.foo" + match_type: regex + name: "foo" + labels: {} + `, + configBad: true, + }, + //Config with non-matched metric. + { + config: `--- +mappings: +- match: foo.*.* + timer_type: summary + name: "foo" + labels: {} + `, + mappings: mappings{ + { + statsdMetric: "test.1.2", + name: "test_1_2", + labels: map[string]string{}, + notPresent: true, + }, + }, + }, + //Config with no name. + { + config: `--- +mappings: +- match: *\.foo + match_type: regex + labels: + bar: "foo" + `, + configBad: true, + }, + // Example from the README. + { + config: ` +mappings: +- match: test.dispatcher.*.*.* + name: "dispatcher_events_total" + labels: + processor: "$1" + action: "$2" + outcome: "$3" + job: "test_dispatcher" +- match: "*.signup.*.*" + name: "signup_events_total" + labels: + provider: "$2" + outcome: "$3" + job: "${1}_server" +`, + mappings: mappings{ + { + statsdMetric: "test.dispatcher.FooProcessor.send.success", + name: "dispatcher_events_total", + labels: map[string]string{ + "processor": "FooProcessor", + "action": "send", + "outcome": "success", + "job": "test_dispatcher", + }, + }, + { + statsdMetric: "foo_product.signup.facebook.failure", + name: "signup_events_total", + labels: map[string]string{ + "provider": "facebook", + "outcome": "failure", + "job": "foo_product_server", + }, + }, + { + statsdMetric: "test.web-server.foo.bar", + name: "test_web_server_foo_bar", + labels: map[string]string{}, + }, + }, + }, + // Config that drops all. + { + config: `mappings: +- match: . + match_type: regex + name: "drop" + action: drop`, + mappings: mappings{ + { + statsdMetric: "test.a", + }, + { + statsdMetric: "abc", + }, + }, + }, + // Config that has a catch-all to drop all. + { + config: `mappings: +- match: web.* + name: "web" + labels: + site: "$1" +- match: . + match_type: regex + name: "drop" + action: drop`, + mappings: mappings{ + { + statsdMetric: "test.a", + }, + { + statsdMetric: "web.localhost", + name: "web", + labels: map[string]string{ + "site": "localhost", + }, + }, + }, + }, + // Config that has a ttl. + { + config: `mappings: +- match: web.* + name: "web" + ttl: 10s + labels: + site: "$1"`, + mappings: mappings{ + { + statsdMetric: "test.a", + }, + { + statsdMetric: "web.localhost", + name: "web", + labels: map[string]string{ + "site": "localhost", + }, + ttl: time.Second * 10, + }, + }, + }, + // Config that has a default ttl. + { + config: `defaults: + ttl: 1m2s +mappings: +- match: web.* + name: "web" + labels: + site: "$1"`, + mappings: mappings{ + { + statsdMetric: "test.a", + }, + { + statsdMetric: "web.localhost", + name: "web", + labels: map[string]string{ + "site": "localhost", + }, + ttl: time.Minute + time.Second*2, + }, + }, + }, + // Config that override a default ttl. + { + config: `defaults: + ttl: 1m2s +mappings: +- match: web.* + name: "web" + ttl: 5s + labels: + site: "$1"`, + mappings: mappings{ + { + statsdMetric: "test.a", + }, + { + statsdMetric: "web.localhost", + name: "web", + labels: map[string]string{ + "site": "localhost", + }, + ttl: time.Second * 5, + }, + }, + }, + } + + mapper := MetricMapper{} + for i, scenario := range scenarios { + err := mapper.InitFromYAMLString(scenario.config, 1000) + if err != nil && !scenario.configBad { + t.Fatalf("%d. Config load error: %s %s", i, scenario.config, err) + } + if err == nil && scenario.configBad { + t.Fatalf("%d. Expected bad config, but loaded ok: %s", i, scenario.config) + } + + for metric, mapping := range scenario.mappings { + // exporter will call mapper.GetMapping with valid MetricType + // so we also pass a sane MetricType in testing if it's not specified + mapType := mapping.metricType + if mapType == "" { + mapType = MetricTypeCounter + } + m, labels, present := mapper.GetMapping(mapping.statsdMetric, mapType) + if present && mapping.name != "" && m.Name != mapping.name { + t.Fatalf("%d.%q: Expected name %v, got %v", i, metric, m.Name, mapping.name) + } + if mapping.notPresent && present { + t.Fatalf("%d.%q: Expected metric to not be present", i, metric) + } + if len(labels) != len(mapping.labels) { + t.Fatalf("%d.%q: Expected %d labels, got %d", i, metric, len(mapping.labels), len(labels)) + } + for label, value := range labels { + if mapping.labels[label] != value { + t.Fatalf("%d.%q: Expected labels %v, got %v", i, metric, mapping, labels) + } + } + if mapping.ttl > 0 && mapping.ttl != m.Ttl { + t.Fatalf("%d.%q: Expected ttl of %s, got %s", i, metric, mapping.ttl.String(), m.Ttl.String()) + } + if mapping.metricType != "" && mapType != m.MatchMetricType { + t.Fatalf("%d.%q: Expected match metric of %s, got %s", i, metric, mapType, m.MatchMetricType) + } + + if len(mapping.quantiles) != 0 { + if len(mapping.quantiles) != len(m.SummaryOptions.Quantiles) { + t.Fatalf("%d.%q: Expected %d quantiles, got %d", i, metric, len(mapping.quantiles), len(m.SummaryOptions.Quantiles)) + } + for i, quantile := range mapping.quantiles { + if quantile.Quantile != m.SummaryOptions.Quantiles[i].Quantile { + t.Fatalf("%d.%q: Expected quantile %v, got %v", i, metric, m.SummaryOptions.Quantiles[i].Quantile, quantile.Quantile) + } + if quantile.Error != m.SummaryOptions.Quantiles[i].Error { + t.Fatalf("%d.%q: Expected Error margin %v, got %v", i, metric, m.SummaryOptions.Quantiles[i].Error, quantile.Error) + } + } + } + if mapping.maxAge != 0 && mapping.maxAge != m.SummaryOptions.MaxAge { + t.Fatalf("%d.%q: Expected max age %v, got %v", i, metric, mapping.maxAge, m.SummaryOptions.MaxAge) + } + if mapping.ageBuckets != 0 && mapping.ageBuckets != m.SummaryOptions.AgeBuckets { + t.Fatalf("%d.%q: Expected max age %v, got %v", i, metric, mapping.ageBuckets, m.SummaryOptions.AgeBuckets) + } + if mapping.bufCap != 0 && mapping.bufCap != m.SummaryOptions.BufCap { + t.Fatalf("%d.%q: Expected max age %v, got %v", i, metric, mapping.bufCap, m.SummaryOptions.BufCap) + } + } + } +} + +func TestAction(t *testing.T) { + scenarios := []struct { + config string + configBad bool + expectedAction ActionType + }{ + { + // no action set + config: `--- +mappings: +- match: test.*.* + name: "foo" +`, + configBad: false, + expectedAction: ActionTypeMap, + }, + { + // map action set + config: `--- +mappings: +- match: test.*.* + name: "foo" + action: map +`, + configBad: false, + expectedAction: ActionTypeMap, + }, + { + // drop action set + config: `--- +mappings: +- match: test.*.* + name: "foo" + action: drop +`, + configBad: false, + expectedAction: ActionTypeDrop, + }, + { + // invalid action set + config: `--- +mappings: +- match: test.*.* + name: "foo" + action: xyz +`, + configBad: true, + expectedAction: ActionTypeDrop, + }, + { + // valid yaml example + config: `--- +mappings: +- match: "test\\.(\\w+)\\.(\\w+)\\.counter" + match_type: regex + name: "${2}_total" + labels: + provider: "$1" +`, + configBad: false, + expectedAction: ActionTypeMap, + }, + { + // invalid yaml example + config: `--- +mappings: +- match: "test\.(\w+)\.(\w+)\.counter" + match_type: regex + name: "${2}_total" + labels: + provider: "$1" +`, + configBad: true, + }, + } + + for i, scenario := range scenarios { + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(scenario.config, 0) + if err != nil && !scenario.configBad { + t.Fatalf("%d. Config load error: %s %s", i, scenario.config, err) + } + if err == nil && scenario.configBad { + t.Fatalf("%d. Expected bad config, but loaded ok: %s", i, scenario.config) + } + + if !scenario.configBad { + a := mapper.Mappings[0].Action + if scenario.expectedAction != a { + t.Fatalf("%d: Expected action %v, got %v", i, scenario.expectedAction, a) + } + } + } +} + +// Test for https://github.com/prometheus/statsd_exporter/issues/273 +// Corrupt cache for multiple names matching in fsm +func TestMultipleMatches(t *testing.T) { + config := `--- +mappings: +- match: aa.bb.*.* + name: "aa_bb_${1}_total" + labels: + app: "$2" +` + mapper := MetricMapper{} + err := mapper.InitFromYAMLString(config, 0) + if err != nil { + t.Fatalf("config load error: %s ", err) + } + + names := map[string]string{ + "aa.bb.aa.myapp": "aa_bb_aa_total", + "aa.bb.bb.myapp": "aa_bb_bb_total", + "aa.bb.cc.myapp": "aa_bb_cc_total", + "aa.bb.dd.myapp": "aa_bb_dd_total", + } + + scenarios := []struct { + cacheSize int + }{ + { + cacheSize: 0, + }, + { + cacheSize: len(names), + }, + } + + for i, scenario := range scenarios { + mapper.InitCache(scenario.cacheSize) + + // run multiple times to ensure cache works as expected + for j := 0; j < 10; j++ { + for name, expected := range names { + m, _, ok := mapper.GetMapping(name, MetricTypeCounter) + if !ok { + t.Fatalf("%d:%d Did not find match for %s", i, j, name) + } + if m.Name != expected { + t.Fatalf("%d:%d Expected name %s, got %s", i, j, expected, m.Name) + } + } + } + } + +} diff --git a/pkg/mapper/match.go b/pkg/mapper/match.go index 12d5e8d..ff6d1b6 100644 --- a/pkg/mapper/match.go +++ b/pkg/mapper/match.go @@ -1,41 +1,41 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import "fmt" - -type MatchType string - -const ( - MatchTypeGlob MatchType = "glob" - MatchTypeRegex MatchType = "regex" - MatchTypeDefault MatchType = "" -) - -func (t *MatchType) UnmarshalYAML(unmarshal func(interface{}) error) error { - var v string - if err := unmarshal(&v); err != nil { - return err - } - - switch MatchType(v) { - case MatchTypeRegex: - *t = MatchTypeRegex - case MatchTypeGlob, MatchTypeDefault: - *t = MatchTypeGlob - default: - return fmt.Errorf("invalid match type %q", v) - } - return nil -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import "fmt" + +type MatchType string + +const ( + MatchTypeGlob MatchType = "glob" + MatchTypeRegex MatchType = "regex" + MatchTypeDefault MatchType = "" +) + +func (t *MatchType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var v string + if err := unmarshal(&v); err != nil { + return err + } + + switch MatchType(v) { + case MatchTypeRegex: + *t = MatchTypeRegex + case MatchTypeGlob, MatchTypeDefault: + *t = MatchTypeGlob + default: + return fmt.Errorf("invalid match type %q", v) + } + return nil +} diff --git a/pkg/mapper/metric_type.go b/pkg/mapper/metric_type.go index 0a0810f..af53b59 100644 --- a/pkg/mapper/metric_type.go +++ b/pkg/mapper/metric_type.go @@ -1,43 +1,43 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import "fmt" - -type MetricType string - -const ( - MetricTypeCounter MetricType = "counter" - MetricTypeGauge MetricType = "gauge" - MetricTypeTimer MetricType = "timer" -) - -func (m *MetricType) UnmarshalYAML(unmarshal func(interface{}) error) error { - var v string - if err := unmarshal(&v); err != nil { - return err - } - - switch MetricType(v) { - case MetricTypeCounter: - *m = MetricTypeCounter - case MetricTypeGauge: - *m = MetricTypeGauge - case MetricTypeTimer: - *m = MetricTypeTimer - default: - return fmt.Errorf("invalid metric type '%s'", v) - } - return nil -} +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import "fmt" + +type MetricType string + +const ( + MetricTypeCounter MetricType = "counter" + MetricTypeGauge MetricType = "gauge" + MetricTypeTimer MetricType = "timer" +) + +func (m *MetricType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var v string + if err := unmarshal(&v); err != nil { + return err + } + + switch MetricType(v) { + case MetricTypeCounter: + *m = MetricTypeCounter + case MetricTypeGauge: + *m = MetricTypeGauge + case MetricTypeTimer: + *m = MetricTypeTimer + default: + return fmt.Errorf("invalid metric type '%s'", v) + } + return nil +} diff --git a/pkg/mapper/timer.go b/pkg/mapper/timer.go index f1d2fb7..60ccb01 100644 --- a/pkg/mapper/timer.go +++ b/pkg/mapper/timer.go @@ -1,41 +1,41 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mapper - -import "fmt" - -type TimerType string - -const ( - TimerTypeHistogram TimerType = "histogram" - TimerTypeSummary TimerType = "summary" - TimerTypeDefault TimerType = "" -) - -func (t *TimerType) UnmarshalYAML(unmarshal func(interface{}) error) error { - var v string - if err := unmarshal(&v); err != nil { - return err - } - - switch TimerType(v) { - case TimerTypeHistogram: - *t = TimerTypeHistogram - case TimerTypeSummary, TimerTypeDefault: - *t = TimerTypeSummary - default: - return fmt.Errorf("invalid timer type '%s'", v) - } - return nil -} +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import "fmt" + +type TimerType string + +const ( + TimerTypeHistogram TimerType = "histogram" + TimerTypeSummary TimerType = "summary" + TimerTypeDefault TimerType = "" +) + +func (t *TimerType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var v string + if err := unmarshal(&v); err != nil { + return err + } + + switch TimerType(v) { + case TimerTypeHistogram: + *t = TimerTypeHistogram + case TimerTypeSummary, TimerTypeDefault: + *t = TimerTypeSummary + default: + return fmt.Errorf("invalid timer type '%s'", v) + } + return nil +} diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go new file mode 100644 index 0000000..e655233 --- /dev/null +++ b/pkg/metrics/metrics.go @@ -0,0 +1,54 @@ +package metrics + +import ( + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +type MetricType int + +const ( + CounterMetricType MetricType = iota + GaugeMetricType + SummaryMetricType + HistogramMetricType +) + +type NameHash uint64 + +type ValueHash uint64 + +type LabelHash struct { + // This is a hash over the label names + Names NameHash + // This is a hash over the label names + label values + Values ValueHash +} + +type MetricHolder interface{} + +type VectorHolder interface { + Delete(label prometheus.Labels) bool +} + +type Vector struct { + Holder VectorHolder + RefCount uint64 +} + +type Metric struct { + MetricType MetricType + // Vectors key is the hash of the label names + Vectors map[NameHash]*Vector + // Metrics key is a hash of the label names + label values + Metrics map[ValueHash]*RegisteredMetric +} + +type RegisteredMetric struct { + LastRegisteredAt time.Time + Labels prometheus.Labels + TTL time.Duration + Metric MetricHolder + VecKey NameHash +} diff --git a/pkg/metrics/metrics.go~ b/pkg/metrics/metrics.go~ new file mode 100644 index 0000000..b379eeb --- /dev/null +++ b/pkg/metrics/metrics.go~ @@ -0,0 +1,42 @@ +package metrics + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +type metricType int + +const ( + CounterMetricType metricType = iota + GaugeMetricType + SummaryMetricType + HistogramMetricType +) + +type nameHash uint64 +type valueHash uint64 +type labelHash struct { + // This is a hash over the label names + names nameHash + // This is a hash over the label names + label values + values valueHash +} + +type metricHolder interface{} + +type vectorHolder interface { + Delete(label prometheus.Labels) bool +} + +type vector struct { + holder vectorHolder + refCount uint64 +} + +type metric struct { + metricType metricType + // Vectors key is the hash of the label names + vectors map[nameHash]*vector + // Metrics key is a hash of the label names + label values + metrics map[valueHash]*registeredMetric +} diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go new file mode 100644 index 0000000..e4f44fc --- /dev/null +++ b/pkg/registry/registry.go @@ -0,0 +1,370 @@ +package registry + +import ( + "bytes" + "fmt" + "hash" + "hash/fnv" + "sort" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/model" + "github.com/prometheus/statsd_exporter/pkg/clock" + "github.com/prometheus/statsd_exporter/pkg/mapper" + "github.com/prometheus/statsd_exporter/pkg/metrics" +) + +// uncheckedCollector wraps a Collector but its Describe method yields no Desc. +// This allows incoming metrics to have inconsistent label sets +type uncheckedCollector struct { + c prometheus.Collector +} + +func (u uncheckedCollector) Describe(_ chan<- *prometheus.Desc) {} +func (u uncheckedCollector) Collect(c chan<- prometheus.Metric) { + u.c.Collect(c) +} + +type Registry struct { + Metrics map[string]metrics.Metric + Mapper *mapper.MetricMapper + // The below value and label variables are allocated in the registry struct + // so that we don't have to allocate them every time have to compute a label + // hash. + ValueBuf, NameBuf bytes.Buffer + Hasher hash.Hash64 +} + +func NewRegistry(mapper *mapper.MetricMapper) *Registry { + return &Registry{ + Metrics: make(map[string]metrics.Metric), + Mapper: mapper, + Hasher: fnv.New64a(), + } +} + +func (r *Registry) MetricConflicts(metricName string, metricType metrics.MetricType) bool { + vector, hasMetrics := r.Metrics[metricName] + if !hasMetrics { + // No metrics.Metric with this name exists + return false + } + + if vector.MetricType == metricType { + // We've found a copy of this metrics.Metric with this type, but different + // labels, so it's safe to create a new one. + return false + } + + // The metrics.Metric exists, but it's of a different type than we're trying to + // create. + return true +} + +func (r *Registry) StoreCounter(metricName string, hash metrics.LabelHash, labels prometheus.Labels, vec *prometheus.CounterVec, c prometheus.Counter, ttl time.Duration) { + r.Store(metricName, hash, labels, vec, c, metrics.CounterMetricType, ttl) +} + +func (r *Registry) StoreGauge(metricName string, hash metrics.LabelHash, labels prometheus.Labels, vec *prometheus.GaugeVec, g prometheus.Counter, ttl time.Duration) { + r.Store(metricName, hash, labels, vec, g, metrics.GaugeMetricType, ttl) +} + +func (r *Registry) StoreHistogram(metricName string, hash metrics.LabelHash, labels prometheus.Labels, vec *prometheus.HistogramVec, o prometheus.Observer, ttl time.Duration) { + r.Store(metricName, hash, labels, vec, o, metrics.HistogramMetricType, ttl) +} + +func (r *Registry) StoreSummary(metricName string, hash metrics.LabelHash, labels prometheus.Labels, vec *prometheus.SummaryVec, o prometheus.Observer, ttl time.Duration) { + r.Store(metricName, hash, labels, vec, o, metrics.SummaryMetricType, ttl) +} + +func (r *Registry) Store(metricName string, hash metrics.LabelHash, labels prometheus.Labels, vh metrics.VectorHolder, mh metrics.MetricHolder, metricType metrics.MetricType, ttl time.Duration) { + metric, hasMetrics := r.Metrics[metricName] + if !hasMetrics { + metric.MetricType = metricType + metric.Vectors = make(map[metrics.NameHash]*metrics.Vector) + metric.Metrics = make(map[metrics.ValueHash]*metrics.RegisteredMetric) + + r.Metrics[metricName] = metric + } + + v, ok := metric.Vectors[hash.Names] + if !ok { + v = &metrics.Vector{Holder: vh} + metric.Vectors[hash.Names] = v + } + + rm, ok := metric.Metrics[hash.Values] + if !ok { + rm = &metrics.RegisteredMetric{ + Labels: labels, + TTL: ttl, + Metric: mh, + VecKey: hash.Names, + } + metric.Metrics[hash.Values] = rm + v.RefCount++ + } + now := clock.Now() + rm.LastRegisteredAt = now + // Update ttl from mapping + rm.TTL = ttl +} + +func (r *Registry) Get(metricName string, hash metrics.LabelHash, metricType metrics.MetricType) (metrics.VectorHolder, metrics.MetricHolder) { + metric, hasMetric := r.Metrics[metricName] + + if !hasMetric { + return nil, nil + } + if metric.MetricType != metricType { + return nil, nil + } + + rm, ok := metric.Metrics[hash.Values] + if ok { + now := clock.Now() + rm.LastRegisteredAt = now + return metric.Vectors[hash.Names].Holder, rm.Metric + } + + vector, ok := metric.Vectors[hash.Names] + if ok { + return vector.Holder, nil + } + + return nil, nil +} + +func (r *Registry) GetCounter(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping, metricsCount *prometheus.GaugeVec) (prometheus.Counter, error) { + hash, labelNames := r.HashLabels(labels) + vh, mh := r.Get(metricName, hash, metrics.CounterMetricType) + if mh != nil { + return mh.(prometheus.Counter), nil + } + + if r.MetricConflicts(metricName, metrics.CounterMetricType) { + return nil, fmt.Errorf("Metric with name %s is already registered", metricName) + } + + var counterVec *prometheus.CounterVec + if vh == nil { + metricsCount.WithLabelValues("counter").Inc() + counterVec = prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: metricName, + Help: help, + }, labelNames) + + if err := prometheus.Register(uncheckedCollector{counterVec}); err != nil { + return nil, err + } + } else { + counterVec = vh.(*prometheus.CounterVec) + } + + var counter prometheus.Counter + var err error + if counter, err = counterVec.GetMetricWith(labels); err != nil { + return nil, err + } + r.StoreCounter(metricName, hash, labels, counterVec, counter, mapping.Ttl) + + return counter, nil +} + +func (r *Registry) GetGauge(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping, metricsCount *prometheus.GaugeVec) (prometheus.Gauge, error) { + hash, labelNames := r.HashLabels(labels) + vh, mh := r.Get(metricName, hash, metrics.GaugeMetricType) + if mh != nil { + return mh.(prometheus.Gauge), nil + } + + if r.MetricConflicts(metricName, metrics.GaugeMetricType) { + return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName) + } + + var gaugeVec *prometheus.GaugeVec + if vh == nil { + metricsCount.WithLabelValues("gauge").Inc() + gaugeVec = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: metricName, + Help: help, + }, labelNames) + + if err := prometheus.Register(uncheckedCollector{gaugeVec}); err != nil { + return nil, err + } + } else { + gaugeVec = vh.(*prometheus.GaugeVec) + } + + var gauge prometheus.Gauge + var err error + if gauge, err = gaugeVec.GetMetricWith(labels); err != nil { + return nil, err + } + r.StoreGauge(metricName, hash, labels, gaugeVec, gauge, mapping.Ttl) + + return gauge, nil +} + +func (r *Registry) GetHistogram(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping, metricsCount *prometheus.GaugeVec) (prometheus.Observer, error) { + hash, labelNames := r.HashLabels(labels) + vh, mh := r.Get(metricName, hash, metrics.HistogramMetricType) + if mh != nil { + return mh.(prometheus.Observer), nil + } + + if r.MetricConflicts(metricName, metrics.HistogramMetricType) { + return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName) + } + if r.MetricConflicts(metricName+"_sum", metrics.HistogramMetricType) { + return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName) + } + if r.MetricConflicts(metricName+"_count", metrics.HistogramMetricType) { + return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName) + } + if r.MetricConflicts(metricName+"_bucket", metrics.HistogramMetricType) { + return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName) + } + + var histogramVec *prometheus.HistogramVec + if vh == nil { + metricsCount.WithLabelValues("histogram").Inc() + buckets := r.Mapper.Defaults.Buckets + if mapping.HistogramOptions != nil && len(mapping.HistogramOptions.Buckets) > 0 { + buckets = mapping.HistogramOptions.Buckets + } + histogramVec = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Name: metricName, + Help: help, + Buckets: buckets, + }, labelNames) + + if err := prometheus.Register(uncheckedCollector{histogramVec}); err != nil { + return nil, err + } + } else { + histogramVec = vh.(*prometheus.HistogramVec) + } + + var observer prometheus.Observer + var err error + if observer, err = histogramVec.GetMetricWith(labels); err != nil { + return nil, err + } + r.StoreHistogram(metricName, hash, labels, histogramVec, observer, mapping.Ttl) + + return observer, nil +} + +func (r *Registry) GetSummary(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping, metricsCount *prometheus.GaugeVec) (prometheus.Observer, error) { + hash, labelNames := r.HashLabels(labels) + vh, mh := r.Get(metricName, hash, metrics.SummaryMetricType) + if mh != nil { + return mh.(prometheus.Observer), nil + } + + if r.MetricConflicts(metricName, metrics.SummaryMetricType) { + return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName) + } + if r.MetricConflicts(metricName+"_sum", metrics.SummaryMetricType) { + return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName) + } + if r.MetricConflicts(metricName+"_count", metrics.SummaryMetricType) { + return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName) + } + + var summaryVec *prometheus.SummaryVec + if vh == nil { + metricsCount.WithLabelValues("summary").Inc() + quantiles := r.Mapper.Defaults.Quantiles + if mapping != nil && mapping.SummaryOptions != nil && len(mapping.SummaryOptions.Quantiles) > 0 { + quantiles = mapping.SummaryOptions.Quantiles + } + summaryOptions := mapper.SummaryOptions{} + if mapping != nil && mapping.SummaryOptions != nil { + summaryOptions = *mapping.SummaryOptions + } + objectives := make(map[float64]float64) + for _, q := range quantiles { + objectives[q.Quantile] = q.Error + } + // In the case of no mapping file, explicitly define the default quantiles + if len(objectives) == 0 { + objectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} + } + summaryVec = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + Name: metricName, + Help: help, + Objectives: objectives, + MaxAge: summaryOptions.MaxAge, + AgeBuckets: summaryOptions.AgeBuckets, + BufCap: summaryOptions.BufCap, + }, labelNames) + + if err := prometheus.Register(uncheckedCollector{summaryVec}); err != nil { + return nil, err + } + } else { + summaryVec = vh.(*prometheus.SummaryVec) + } + + var observer prometheus.Observer + var err error + if observer, err = summaryVec.GetMetricWith(labels); err != nil { + return nil, err + } + r.StoreSummary(metricName, hash, labels, summaryVec, observer, mapping.Ttl) + + return observer, nil +} + +func (r *Registry) RemoveStaleMetrics() { + now := clock.Now() + // delete timeseries with expired ttl + for _, metric := range r.Metrics { + for hash, rm := range metric.Metrics { + if rm.TTL == 0 { + continue + } + if rm.LastRegisteredAt.Add(rm.TTL).Before(now) { + metric.Vectors[rm.VecKey].Holder.Delete(rm.Labels) + metric.Vectors[rm.VecKey].RefCount-- + delete(metric.Metrics, hash) + } + } + } +} + +// Calculates a hash of both the label names and the label names and values. +func (r *Registry) HashLabels(labels prometheus.Labels) (metrics.LabelHash, []string) { + r.Hasher.Reset() + r.NameBuf.Reset() + r.ValueBuf.Reset() + labelNames := make([]string, 0, len(labels)) + + for labelName := range labels { + labelNames = append(labelNames, labelName) + } + sort.Strings(labelNames) + + r.ValueBuf.WriteByte(model.SeparatorByte) + for _, labelName := range labelNames { + r.ValueBuf.WriteString(labels[labelName]) + r.ValueBuf.WriteByte(model.SeparatorByte) + + r.NameBuf.WriteString(labelName) + r.NameBuf.WriteByte(model.SeparatorByte) + } + + lh := metrics.LabelHash{} + r.Hasher.Write(r.NameBuf.Bytes()) + lh.Names = metrics.NameHash(r.Hasher.Sum64()) + + // Now add the values to the names we've already hashed. + r.Hasher.Write(r.ValueBuf.Bytes()) + lh.Values = metrics.ValueHash(r.Hasher.Sum64()) + + return lh, labelNames +} diff --git a/pkg/registry/registry.go~ b/pkg/registry/registry.go~ new file mode 100644 index 0000000..96da234 --- /dev/null +++ b/pkg/registry/registry.go~ @@ -0,0 +1,356 @@ +package registry + +import ( + "github.com/prometheus/statsd_exporter/pkg/metrics" +) + +type RegisteredMetric struct { + lastRegisteredAt time.Time + labels prometheus.Labels + ttl time.Duration + metric metricHolder + vecKey nameHash +} + +type Registry struct { + metrics map[string]metric + mapper *mapper.MetricMapper + // The below value and label variables are allocated in the registry struct + // so that we don't have to allocate them every time have to compute a label + // hash. + valueBuf, nameBuf bytes.Buffer + hasher hash.Hash64 +} + +func NewRegistry(mapper *mapper.MetricMapper) *registry { + return ®istry{ + metrics: make(map[string]metric), + mapper: mapper, + hasher: fnv.New64a(), + } +} + +func (r *registry) MetricConflicts(metricName string, metricType metricType) bool { + vector, hasMetric := r.metrics[metricName] + if !hasMetric { + // No metric with this name exists + return false + } + + if vector.metricType == metricType { + // We've found a copy of this metric with this type, but different + // labels, so it's safe to create a new one. + return false + } + + // The metric exists, but it's of a different type than we're trying to + // create. + return true +} + +func (r *registry) StoreCounter(metricName string, hash labelHash, labels prometheus.Labels, vec *prometheus.CounterVec, c prometheus.Counter, ttl time.Duration) { + r.store(metricName, hash, labels, vec, c, CounterMetricType, ttl) +} + +func (r *registry) StoreGauge(metricName string, hash labelHash, labels prometheus.Labels, vec *prometheus.GaugeVec, g prometheus.Counter, ttl time.Duration) { + r.store(metricName, hash, labels, vec, g, GaugeMetricType, ttl) +} + +func (r *registry) StoreHistogram(metricName string, hash labelHash, labels prometheus.Labels, vec *prometheus.HistogramVec, o prometheus.Observer, ttl time.Duration) { + r.store(metricName, hash, labels, vec, o, HistogramMetricType, ttl) +} + +func (r *registry) StoreSummary(metricName string, hash labelHash, labels prometheus.Labels, vec *prometheus.SummaryVec, o prometheus.Observer, ttl time.Duration) { + r.store(metricName, hash, labels, vec, o, SummaryMetricType, ttl) +} + +func (r *registry) Store(metricName string, hash labelHash, labels prometheus.Labels, vh vectorHolder, mh metricHolder, metricType metricType, ttl time.Duration) { + metric, hasMetric := r.metrics[metricName] + if !hasMetric { + metric.metricType = metricType + metric.vectors = make(map[nameHash]*vector) + metric.metrics = make(map[valueHash]*registeredMetric) + + r.metrics[metricName] = metric + } + + v, ok := metric.vectors[hash.names] + if !ok { + v = &vector{holder: vh} + metric.vectors[hash.names] = v + } + + rm, ok := metric.metrics[hash.values] + if !ok { + rm = ®isteredMetric{ + labels: labels, + ttl: ttl, + metric: mh, + vecKey: hash.names, + } + metric.metrics[hash.values] = rm + v.refCount++ + } + now := clock.Now() + rm.lastRegisteredAt = now + // Update ttl from mapping + rm.ttl = ttl +} + +func (r *registry) Get(metricName string, hash labelHash, metricType metricType) (vectorHolder, metricHolder) { + metric, hasMetric := r.metrics[metricName] + + if !hasMetric { + return nil, nil + } + if metric.metricType != metricType { + return nil, nil + } + + rm, ok := metric.metrics[hash.values] + if ok { + now := clock.Now() + rm.lastRegisteredAt = now + return metric.vectors[hash.names].holder, rm.metric + } + + vector, ok := metric.vectors[hash.names] + if ok { + return vector.holder, nil + } + + return nil, nil +} + +func (r *registry) GetCounter(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping) (prometheus.Counter, error) { + hash, labelNames := r.hashLabels(labels) + vh, mh := r.get(metricName, hash, CounterMetricType) + if mh != nil { + return mh.(prometheus.Counter), nil + } + + if r.metricConflicts(metricName, CounterMetricType) { + return nil, fmt.Errorf("metric with name %s is already registered", metricName) + } + + var counterVec *prometheus.CounterVec + if vh == nil { + metricsCount.WithLabelValues("counter").Inc() + counterVec = prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: metricName, + Help: help, + }, labelNames) + + if err := prometheus.Register(uncheckedCollector{counterVec}); err != nil { + return nil, err + } + } else { + counterVec = vh.(*prometheus.CounterVec) + } + + var counter prometheus.Counter + var err error + if counter, err = counterVec.GetMetricWith(labels); err != nil { + return nil, err + } + r.storeCounter(metricName, hash, labels, counterVec, counter, mapping.Ttl) + + return counter, nil +} + +func (r *registry) GetGauge(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping) (prometheus.Gauge, error) { + hash, labelNames := r.hashLabels(labels) + vh, mh := r.get(metricName, hash, GaugeMetricType) + if mh != nil { + return mh.(prometheus.Gauge), nil + } + + if r.metricConflicts(metricName, GaugeMetricType) { + return nil, fmt.Errorf("metric with name %s is already registered", metricName) + } + + var gaugeVec *prometheus.GaugeVec + if vh == nil { + metricsCount.WithLabelValues("gauge").Inc() + gaugeVec = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: metricName, + Help: help, + }, labelNames) + + if err := prometheus.Register(uncheckedCollector{gaugeVec}); err != nil { + return nil, err + } + } else { + gaugeVec = vh.(*prometheus.GaugeVec) + } + + var gauge prometheus.Gauge + var err error + if gauge, err = gaugeVec.GetMetricWith(labels); err != nil { + return nil, err + } + r.storeGauge(metricName, hash, labels, gaugeVec, gauge, mapping.Ttl) + + return gauge, nil +} + +func (r *registry) GetHistogram(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping) (prometheus.Observer, error) { + hash, labelNames := r.hashLabels(labels) + vh, mh := r.get(metricName, hash, HistogramMetricType) + if mh != nil { + return mh.(prometheus.Observer), nil + } + + if r.metricConflicts(metricName, HistogramMetricType) { + return nil, fmt.Errorf("metric with name %s is already registered", metricName) + } + if r.metricConflicts(metricName+"_sum", HistogramMetricType) { + return nil, fmt.Errorf("metric with name %s is already registered", metricName) + } + if r.metricConflicts(metricName+"_count", HistogramMetricType) { + return nil, fmt.Errorf("metric with name %s is already registered", metricName) + } + if r.metricConflicts(metricName+"_bucket", HistogramMetricType) { + return nil, fmt.Errorf("metric with name %s is already registered", metricName) + } + + var histogramVec *prometheus.HistogramVec + if vh == nil { + metricsCount.WithLabelValues("histogram").Inc() + buckets := r.mapper.Defaults.Buckets + if mapping.HistogramOptions != nil && len(mapping.HistogramOptions.Buckets) > 0 { + buckets = mapping.HistogramOptions.Buckets + } + histogramVec = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Name: metricName, + Help: help, + Buckets: buckets, + }, labelNames) + + if err := prometheus.Register(uncheckedCollector{histogramVec}); err != nil { + return nil, err + } + } else { + histogramVec = vh.(*prometheus.HistogramVec) + } + + var observer prometheus.Observer + var err error + if observer, err = histogramVec.GetMetricWith(labels); err != nil { + return nil, err + } + r.storeHistogram(metricName, hash, labels, histogramVec, observer, mapping.Ttl) + + return observer, nil +} + +func (r *registry) GetSummary(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping) (prometheus.Observer, error) { + hash, labelNames := r.hashLabels(labels) + vh, mh := r.get(metricName, hash, SummaryMetricType) + if mh != nil { + return mh.(prometheus.Observer), nil + } + + if r.metricConflicts(metricName, SummaryMetricType) { + return nil, fmt.Errorf("metric with name %s is already registered", metricName) + } + if r.metricConflicts(metricName+"_sum", SummaryMetricType) { + return nil, fmt.Errorf("metric with name %s is already registered", metricName) + } + if r.metricConflicts(metricName+"_count", SummaryMetricType) { + return nil, fmt.Errorf("metric with name %s is already registered", metricName) + } + + var summaryVec *prometheus.SummaryVec + if vh == nil { + metricsCount.WithLabelValues("summary").Inc() + quantiles := r.mapper.Defaults.Quantiles + if mapping != nil && mapping.SummaryOptions != nil && len(mapping.SummaryOptions.Quantiles) > 0 { + quantiles = mapping.SummaryOptions.Quantiles + } + summaryOptions := mapper.SummaryOptions{} + if mapping != nil && mapping.SummaryOptions != nil { + summaryOptions = *mapping.SummaryOptions + } + objectives := make(map[float64]float64) + for _, q := range quantiles { + objectives[q.Quantile] = q.Error + } + // In the case of no mapping file, explicitly define the default quantiles + if len(objectives) == 0 { + objectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} + } + summaryVec = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + Name: metricName, + Help: help, + Objectives: objectives, + MaxAge: summaryOptions.MaxAge, + AgeBuckets: summaryOptions.AgeBuckets, + BufCap: summaryOptions.BufCap, + }, labelNames) + + if err := prometheus.Register(uncheckedCollector{summaryVec}); err != nil { + return nil, err + } + } else { + summaryVec = vh.(*prometheus.SummaryVec) + } + + var observer prometheus.Observer + var err error + if observer, err = summaryVec.GetMetricWith(labels); err != nil { + return nil, err + } + r.storeSummary(metricName, hash, labels, summaryVec, observer, mapping.Ttl) + + return observer, nil +} + +func (r *registry) RemoveStaleMetrics() { + now := clock.Now() + // delete timeseries with expired ttl + for _, metric := range r.metrics { + for hash, rm := range metric.metrics { + if rm.ttl == 0 { + continue + } + if rm.lastRegisteredAt.Add(rm.ttl).Before(now) { + metric.vectors[rm.vecKey].holder.Delete(rm.labels) + metric.vectors[rm.vecKey].refCount-- + delete(metric.metrics, hash) + } + } + } +} + +// Calculates a hash of both the label names and the label names and values. +func (r *registry) HashLabels(labels prometheus.Labels) (labelHash, []string) { + r.hasher.Reset() + r.nameBuf.Reset() + r.valueBuf.Reset() + labelNames := make([]string, 0, len(labels)) + + for labelName := range labels { + labelNames = append(labelNames, labelName) + } + sort.Strings(labelNames) + + r.valueBuf.WriteByte(model.SeparatorByte) + for _, labelName := range labelNames { + r.valueBuf.WriteString(labels[labelName]) + r.valueBuf.WriteByte(model.SeparatorByte) + + r.nameBuf.WriteString(labelName) + r.nameBuf.WriteByte(model.SeparatorByte) + } + + lh := labelHash{} + r.hasher.Write(r.nameBuf.Bytes()) + lh.names = nameHash(r.hasher.Sum64()) + + // Now add the values to the names we've already hashed. + r.hasher.Write(r.valueBuf.Bytes()) + lh.values = valueHash(r.hasher.Sum64()) + + return lh, labelNames +} diff --git a/pkg/util/util.go b/pkg/util/util.go new file mode 100644 index 0000000..d5a3c12 --- /dev/null +++ b/pkg/util/util.go @@ -0,0 +1,53 @@ +package util + +import ( + "fmt" + "net" + "strconv" +) + +func IPPortFromString(addr string) (*net.IPAddr, int, error) { + host, portStr, err := net.SplitHostPort(addr) + if err != nil { + return nil, 0, fmt.Errorf("bad StatsD listening address: %s", addr) + } + + if host == "" { + host = "0.0.0.0" + } + ip, err := net.ResolveIPAddr("ip", host) + if err != nil { + return nil, 0, fmt.Errorf("Unable to resolve %s: %s", host, err) + } + + port, err := strconv.Atoi(portStr) + if err != nil || port < 0 || port > 65535 { + return nil, 0, fmt.Errorf("Bad port %s: %s", portStr, err) + } + + return ip, port, nil +} + +func UDPAddrFromString(addr string) (*net.UDPAddr, error) { + ip, port, err := IPPortFromString(addr) + if err != nil { + return nil, err + } + return &net.UDPAddr{ + IP: ip.IP, + Port: port, + Zone: ip.Zone, + }, nil +} + +func TCPAddrFromString(addr string) (*net.TCPAddr, error) { + ip, port, err := IPPortFromString(addr) + if err != nil { + return nil, err + } + return &net.TCPAddr{ + IP: ip.IP, + Port: port, + Zone: ip.Zone, + }, nil +} diff --git a/pkg/util/util.go~ b/pkg/util/util.go~ new file mode 100644 index 0000000..3dc88da --- /dev/null +++ b/pkg/util/util.go~ @@ -0,0 +1,53 @@ +package util + +import ( + "fmt" + "net" + "strconv" +) + +func IPPortFromString(addr string) (*net.IPAddr, int, error) { + host, portStr, err := net.SplitHostPort(addr) + if err != nil { + return nil, 0, fmt.Errorf("bad StatsD listening address: %s", addr) + } + + if host == "" { + host = "0.0.0.0" + } + ip, err := net.ResolveIPAddr("ip", host) + if err != nil { + return nil, 0, fmt.Errorf("Unable to resolve %s: %s", host, err) + } + + port, err := strconv.Atoi(portStr) + if err != nil || port < 0 || port > 65535 { + return nil, 0, fmt.Errorf("Bad port %s: %s", portStr, err) + } + + return ip, port, nil +} + +func UDPAddrFromString(addr string) (*net.UDPAddr, error) { + ip, port, err := ipPortFromString(addr) + if err != nil { + return nil, err + } + return &net.UDPAddr{ + IP: ip.IP, + Port: port, + Zone: ip.Zone, + }, nil +} + +func TCPAddrFromString(addr string) (*net.TCPAddr, error) { + ip, port, err := ipPortFromString(addr) + if err != nil { + return nil, err + } + return &net.TCPAddr{ + IP: ip.IP, + Port: port, + Zone: ip.Zone, + }, nil +} diff --git a/statsd_exporter.exe b/statsd_exporter.exe new file mode 100644 index 0000000000000000000000000000000000000000..974a50a64c81c2db98c9e70ad6dd9da021419d3d GIT binary patch literal 14264320 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


#shLVi~B2rDV(6YbC< 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%0A0(rMx1fECP-5Xg8~1$}*Q$qka|MTp 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 z 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

AOq0BPm@7D0XvYYq$j0p~#e-eKS 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

8!F1Q|dUPGA@ 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�Zbsw@Yk@g>C}E`KS@!PS>00Rpqu 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