The Prometheus monitoring system and time series database.
Find a file
beorn7 0e202dacb4 Streamline series iterator creation
This will fix issue #1035 and will also help to make issue #1264 less
bad.

The fundamental problem in the current code:

In the preload phase, we quite accurately determine which chunks will
be used for the query being executed. However, in the subsequent step
of creating series iterators, the created iterators are referencing
_all_ in-memory chunks in their series, even the un-pinned ones. In
iterator creation, we copy a pointer to each in-memory chunk of a
series into the iterator. While this creates a certain amount of
allocation churn, the worst thing about it is that copying the chunk
pointer out of the chunkDesc requires a mutex acquisition. (Remember
that the iterator will also reference un-pinned chunks, so we need to
acquire the mutex to protect against concurrent eviction.) The worst
case happens if a series doesn't even contain any relevant samples for
the query time range. We notice that during preloading but then we
will still create a series iterator for it. But even for series that
do contain relevant samples, the overhead is quite bad for instant
queries that retrieve a single sample from each series, but still go
through all the effort of series iterator creation. All of that is
particularly bad if a series has many in-memory chunks.

This commit addresses the problem from two sides:

First, it merges preloading and iterator creation into one step,
i.e. the preload call returns an iterator for exactly the preloaded
chunks.

Second, the required mutex acquisition in chunkDesc has been greatly
reduced. That was enabled by a side effect of the first step, which is
that the iterator is only referencing pinned chunks, so there is no
risk of concurrent eviction anymore, and chunks can be accessed
without mutex acquisition.

To simplify the code changes for the above, the long-planned change of
ValueAtTime to ValueAtOrBefore time was performed at the same
time. (It should have been done first, but it kind of accidentally
happened while I was in the middle of writing the series iterator
changes. Sorry for that.) So far, we actively filtered the up to two
values that were returned by ValueAtTime, i.e. we invested work to
retrieve up to two values, and then we invested more work to throw one
of them away.

The SeriesIterator.BoundaryValues method can be removed once #1401 is
fixed. But I really didn't want to load even more changes into this
PR.

Benchmarks:

The BenchmarkFuzz.* benchmarks run 83% faster (i.e. about six times
faster) and allocate 95% fewer bytes. The reason for that is that the
benchmark reads one sample after another from the time series and
creates a new series iterator for each sample read.

To find out how much these improvements matter in practice, I have
mirrored a beefy Prometheus server at SoundCloud that suffers from
both issues #1035 and #1264. To reach steady state that would be
comparable, the server needs to run for 15d. So far, it has run for
1d. The test server currently has only half as many memory time series
and 60% of the memory chunks the main server has. The 90th percentile
rule evaluation cycle time is ~11s on the main server and only ~3s on
the test server. However, these numbers might get much closer over
time.

In addition to performance improvements, this commit removes about 150
LOC.
2016-02-19 16:24:38 +01:00
cmd Merge pull request #1408 from prometheus/hostname 2016-02-19 12:22:12 +01:00
config Fix global config YAML issues 2016-02-15 14:08:25 +01:00
console_libraries Add blackbox console. 2015-11-01 20:06:52 +00:00
consoles Fix the instrumentation fixes 2016-02-17 15:50:55 +01:00
documentation Fix typo in documentation/examples/kubernetes-rabbitmq/README.md 2016-02-08 02:00:10 +01:00
notification Sanitize POST URL for AM integration 2016-02-04 11:56:14 +01:00
promql Streamline series iterator creation 2016-02-19 16:24:38 +01:00
retrieval Use fingerprint for target identity comparison 2016-02-17 16:34:53 +01:00
rules Fix the instrumentation fixes 2016-02-17 15:50:55 +01:00
scripts scripts/goenv.sh: Require Go 1.5.3 2016-01-20 13:25:03 +01:00
storage Streamline series iterator creation 2016-02-19 16:24:38 +01:00
template template: Use zero-values for missing values. 2015-11-28 13:45:32 +00:00
util Fix various typos in comments. 2016-02-10 03:47:00 +01:00
vendor Update common/expfmt vendoring 2016-02-11 16:08:29 +01:00
version Update version on master branch 2015-11-05 10:34:29 +01:00
web Make scraping offset consistent. 2016-02-15 16:46:29 +01:00
.dockerignore Add service discovery using Marathon API. 2015-08-10 01:36:24 +02:00
.gitignore Remove -web.use-local-assets 2015-11-11 17:58:03 +01:00
.travis.yml Let code format style errors fail CI 2016-01-06 18:29:28 -05:00
AUTHORS.md Update Julius's email address in AUTHORS.md 2015-10-26 02:21:39 +01:00
CHANGELOG.md Update CHANGELOG.md 2015-10-20 23:25:24 -06:00
circle.yml Add circleci yaml for Dockerfile test build 2015-06-26 11:00:15 +02:00
CONTRIBUTING.md Update CONTRIBUTING.md. 2015-01-22 15:07:20 +01:00
Dockerfile Add goenv script and fix Docker 2015-09-18 10:28:15 +02:00
LICENSE Clean up license issues. 2015-01-21 20:07:45 +01:00
Makefile Remove assets target from default make execution 2016-01-18 18:24:25 +01:00
NOTICE Add support for Zookeeper Serversets for SD. 2015-06-16 11:02:08 +01:00
README.md Change make to make build 2016-02-05 11:30:31 +01:00

Prometheus Build Status Circle CI

Prometheus is a systems and service monitoring system. It collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts if some condition is observed to be true.

Prometheus' main distinguishing features as compared to other monitoring systems are:

  • a multi-dimensional data model (timeseries defined by metric name and set of key/value dimensions)
  • a flexible query language to leverage this dimensionality
  • no dependency on distributed storage; single server nodes are autonomous
  • timeseries collection happens via a pull model over HTTP
  • pushing timeseries is supported via an intermediary gateway
  • targets are discovered via service discovery or static configuration
  • multiple modes of graphing and dashboarding support
  • support for hierarchical and horizontal federation

Architecture overview

Install

There are various ways of installing Prometheus.

Precompiled binaries

Precompiled binaries for released versions are available in the releases section of the GitHub repository. Using the latest production release binary is the recommended way of installing Prometheus.

Debian and RPM packages are being worked on.

Building from source

To build Prometheus from the source code yourself you need to have a working Go environment with version 1.5 or greater installed.

You can directly use the go tool to download and install the prometheus and promtool binaries into your GOPATH. We use Go 1.5's experimental vendoring feature, so you will also need to set the GO15VENDOREXPERIMENT=1 environment variable in this case:

$ GO15VENDOREXPERIMENT=1 go get github.com/prometheus/prometheus/cmd/...
$ prometheus -config.file=your_config.yml

You can also clone the repository yourself and build using make:

$ mkdir -p $GOPATH/src/github.com/prometheus
$ cd $GOPATH/src/github.com/prometheus
$ git clone https://github.com/prometheus/prometheus.git
$ cd prometheus
$ make build
$ ./prometheus -config.file=your_config.yml

The Makefile provides several targets:

  • build: build the prometheus and promtool binaries
  • test: run the tests
  • format: format the source code
  • vet: check the source code for common errors
  • assets: rebuild the static assets
  • docker: build a docker container for the current HEAD

More information

  • The source code is periodically indexed: Prometheus Core.
  • You will find a Travis CI configuration in .travis.yml.
  • All of the core developers are accessible via the Prometheus Developers Mailinglist and the #prometheus channel on irc.freenode.net.

Contributing

Refer to CONTRIBUTING.md

License

Apache License 2.0, see LICENSE.