From 31e18408142102d0460a0c96080c91e86ca4cb5e Mon Sep 17 00:00:00 2001 From: Ivan Mikheykin Date: Mon, 17 Sep 2018 17:02:28 +0300 Subject: [PATCH] update README, add screenshot --- README.md | 42 ++++++++++++++++++++++++---- src/img/grafana-statusmap-panel.png | Bin 0 -> 26360 bytes 2 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 src/img/grafana-statusmap-panel.png diff --git a/README.md b/README.md index 3186dc3..dd5884d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,30 @@ -### Development +# Statusmap panel for Grafana + + + +![Statusmap sample panel](https://raw.githubusercontent.com/flant/grafana-statusmap/master/src/img/grafana-statusmap-panel.png) + + +## Features + +* Group values into rows and buckets by query's legend +* User defined color mapping +* Multiple values in bucket display in tooltip +* Interval shaping to better visual representation +* Represent null values as empty bucket or as zero + +Supported / Tested Data Sources : +-------------------------------- + +* Prometheus +* TestData + +Tested Grafana versions : +------------------------- + +* 5.1.3 + +## Development ``` docker run --rm -it -v $PWD:/var/lib/grafana/plugins/status-heatmap-panel \ @@ -11,9 +37,13 @@ docker run --rm -it -v $PWD:/var/lib/grafana/plugins/status-heatmap-panel \ grunt watch ``` -Prometheus +### Acknowledgements + +This panel plugin is based on "Heatmap" panel by Grafana with ideas from Carpet plot, Discrete panel, Status Panel, Status Dot, Status By Group. + +#### Changelog + +##### v0.0.1 + +- First public release -``` -ssh kube-cluster -L 3001:localhost:9001 -kubectl port-forward prometheus-0 9001:9090 -n prom-namespace -``` diff --git a/src/img/grafana-statusmap-panel.png b/src/img/grafana-statusmap-panel.png new file mode 100644 index 0000000000000000000000000000000000000000..705b7d5ca242f0497d82ec8ed6bbbb09d1d25d56 GIT binary patch literal 26360 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 z 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