The Prometheus monitoring system and time series database.
Find a file
Tom Wilkie d83879210c Switch back to protos over HTTP, instead of GRPC.
My aim is to support the new grpc generic write path in Frankenstein.  On the surface this seems easy - however I've hit a number of problems that make me think it might be better to not use grpc just yet.

The explanation of the problems requires a little background.  At weave, traffic to frankenstein need to go through a couple of services first, for SSL and to be authenticated.  So traffic goes:

    internet -> frontend -> authfe -> frankenstein

- The frontend is Nginx, and adds/removes SSL.  Its done this way for legacy reasons, so the certs can be managed in one place, although eventually we imagine we'll merge it with authfe.  All traffic from frontend is sent to authfe.
- Authfe checks the auth tokens / cookie etc and then picks the service to forward the RPC to.
- Frankenstein accepts the reads and does the right thing with them.

First problem I hit was Nginx won't proxy http2 requests - it can accept them, but all calls downstream are http1 (see https://trac.nginx.org/nginx/ticket/923).  This wasn't such a big deal, so it now looks like:

    internet --(grpc/http2)--> frontend --(grpc/http1)--> authfe --(grpc/http1)--> frankenstein

Next problem was golang grpc server won't accept http1 requests (see https://groups.google.com/forum/#!topic/grpc-io/JnjCYGPMUms).  It is possible to link a grpc server in with a normal go http mux, as long as the mux server is serving over SSL, as the golang http client & server won't do http2 over anything other than an SSL connection.  This would require making all our service to service comms SSL.  So I had a go a writing a grpc http1 server, and got pretty far.  But is was a bit of a mess.

So finally I thought I'd make a separate grpc frontend for this, running in parallel with the frontend/authfe combo on a different port - and first up I'd need a grpc reverse proxy.  Ideally we'd have some nice, generic reverse proxy that only knew about a map from service names -> downstream service, and didn't need to decode & re-encode every request as it went through.  It seems like this can't be done with golang's grpc library - see https://github.com/mwitkow/grpc-proxy/issues/1.

And then I was surprised to find you can't do grpc from browsers! See http://www.grpc.io/faq/ - not important to us, but I'm starting to question why we decided to use grpc in the first place?

It would seem we could have most of the benefits of grpc with protos over HTTP, and this wouldn't preclude moving to grpc when its a bit more mature?  In fact, the grcp FAQ even admits as much:

> Why is gRPC better than any binary blob over HTTP/2?
> This is largely what gRPC is on the wire.
2016-09-15 23:21:54 +01:00
.github .github: Add issue template 2016-06-06 11:48:14 +02:00
cmd Switch back to protos over HTTP, instead of GRPC. 2016-09-15 23:21:54 +01:00
config Forbid invalid relabel configurations 2016-08-29 16:56:06 +02:00
console_libraries Add blackbox console. 2015-11-01 20:06:52 +00:00
consoles The metrics are no longer ms, we can remove the scaling. 2016-06-29 01:09:24 +01:00
documentation Switch back to protos over HTTP, instead of GRPC. 2016-09-15 23:21:54 +01:00
notifier Simplify struct initialization 2016-09-14 23:13:27 -04:00
promql Fix common english misspellings 2016-09-14 23:23:28 -04:00
relabel move relabeling functionality to its own package 2016-08-09 14:19:20 +02:00
retrieval Fix common english misspellings 2016-09-14 23:23:28 -04:00
rules Revert "Modify tests to adjust to reverting the /graph changes" 2016-09-03 21:08:33 +02:00
scripts New release process using docker, circleci and a centralized 2016-04-18 22:41:04 +02:00
storage Switch back to protos over HTTP, instead of GRPC. 2016-09-15 23:21:54 +01:00
template Revert "Revert the /graph changes." 2016-09-03 21:05:23 +02:00
util Revert "Revert the /graph changes." 2016-09-03 21:05:23 +02:00
vendor Remove grpc vendoring. 2016-09-15 23:15:56 +01:00
web Revert "Revert the /graph changes." 2016-09-03 21:05:23 +02:00
.dockerignore New release process using docker, circleci and a centralized 2016-04-18 22:41:04 +02:00
.gitignore gitignore: clean up 2016-07-04 11:34:33 +02:00
.promu.yml Use the default go version for the crossbuilt process 2016-07-30 11:19:56 +02:00
.travis.yml Add go_import_path to travis so it works on a fork. (#1995) 2016-09-15 17:05:56 -04:00
AUTHORS.md Update Fabian's email address 2016-03-24 17:02:57 +01:00
CHANGELOG.md Cut 1.1.2 2016-09-08 14:17:49 +02:00
circle.yml Use golang-builder base image for tests in CircleCI 2016-09-09 13:13:21 +02:00
CONTRIBUTING.md Update CONTRIBUTING.md. 2015-01-22 15:07:20 +01:00
Dockerfile Docker: Move console dirs to /usr/share/prometheus 2016-07-29 14:00:47 +01:00
LICENSE Clean up license issues. 2015-01-21 20:07:45 +01:00
Makefile Testing: Add more test targets 2016-08-29 10:53:10 +02:00
NOTICE Add support for Zookeeper Serversets for SD. 2015-06-16 11:02:08 +01:00
README.md Link to goreport from README 2016-09-14 23:09:26 -04:00
VERSION Cut 1.1.2 2016-09-08 14:17:49 +02:00

Prometheus Build Status

CircleCI Docker Repository on Quay Docker Pulls Go Report Card

Visit prometheus.io for the full documentation, examples and guides.

Prometheus, a Cloud Native Computing Foundation project, 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 download section on prometheus.io. Using the latest production release binary is the recommended way of installing Prometheus. See the Installing chapter in the documentation for all the details.

Debian packages are available.

Docker images

Docker images are available on Quay.io.

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.