Sebastian Denz
4 years ago
commit
52ead63ca7
30 changed files with 18025 additions and 0 deletions
@ -0,0 +1,163 @@ |
|||||
|
# what is it? |
||||
|
|
||||
|
![alt text](screenshot.png "Logo Title Text 1") |
||||
|
|
||||
|
* a set of tools to export your personal WSJT-X |
||||
|
* live reception data into prometheus or mysql |
||||
|
* historical reception data (since 2019) into mysql |
||||
|
* a tool to poll pskreporter and export your personal |
||||
|
* live transmission data to prometheus or mysql |
||||
|
|
||||
|
every time your wsjtx is/was running you are/were generating nice data points, which can be queried using grafana. |
||||
|
this can be very interesting to evaluate your **personal** hf conditions from the current and the past. |
||||
|
|
||||
|
some use cases: |
||||
|
* choose dxcc, band, mode and timeframe in all combinations so see when your were successfully able to receive and transmit, to plan future activities |
||||
|
* compare input of different station like for antenna comparions |
||||
|
* have nice wallboard for contesting or dxpedition |
||||
|
* display rx/tx data on a map with custom timespan and filters |
||||
|
* compare hf propagration forecasts to your personal situation |
||||
|
* use grafana alerts or prometheus alertmanager to send yourself alerts when your stations receives something interesting |
||||
|
* impress other people with cool dashboards ;) |
||||
|
* ... |
||||
|
|
||||
|
sample dashboards are provided. |
||||
|
|
||||
|
have fun! |
||||
|
73 de DL3SD |
||||
|
|
||||
|
## prerequisites |
||||
|
|
||||
|
* ALL.TXT with interesting data and/or running hamradio station to provide live data |
||||
|
* grafana |
||||
|
* prometheus or mysql |
||||
|
|
||||
|
## repository overview |
||||
|
|
||||
|
* **pskreporter-exporter** |
||||
|
* polls pskreporter.info for your callsign |
||||
|
* supports prometheus and mysql |
||||
|
* **wsjtx-exporter** |
||||
|
* follows live traffice in ALL.txt |
||||
|
* supports prometheus and mysql |
||||
|
* **alltxt2csv** |
||||
|
* reads whole ALL.txt since 2019 and creates csv-file which can be imported into mysql |
||||
|
* **misc** |
||||
|
* sample dashboards |
||||
|
* sql table definitions |
||||
|
* shell script to hop between bands via rigctl to allow fractional monitoring of multiple bands |
||||
|
* ready to launch docker-compose setup based on https://github.com/stefanprodan/dockprom |
||||
|
|
||||
|
## things you should be aware of.. |
||||
|
|
||||
|
### what about prometheus and mysql? |
||||
|
|
||||
|
#### prometheus |
||||
|
|
||||
|
pro |
||||
|
* you get nicer graphs with counters and bars if you ask me |
||||
|
* you can use alertmanager if you want advanced alerting |
||||
|
* optimized for timeseries data |
||||
|
con |
||||
|
* not designed for keeping long timeseries (weeks or some months are fine) |
||||
|
* not possible to import historical data |
||||
|
* not as flexible as mysql regarding complex queries |
||||
|
|
||||
|
#### mysql |
||||
|
|
||||
|
pro: |
||||
|
* you can import your ALL.txt since 2019 |
||||
|
* you can store a lot of data over a long timeframe |
||||
|
* you can propably build more complex queries in sql |
||||
|
con: |
||||
|
* in comparison to prometheus not optimized for timeseries, but still good enough |
||||
|
* gauge based graphs are not as nice as counter/bars if you ask me |
||||
|
* you can use *only* graphanas internal alerting |
||||
|
|
||||
|
both allow distributed setups with multiple wsjtx instances submitting their data to a central prometheus or mysql service. |
||||
|
you can as well run both in parallel and use prometheus for a live overview and mysql for historical evaluations. |
||||
|
|
||||
|
### pskreporter-exporter vs other access/polling of pskreporter like GridTracker |
||||
|
|
||||
|
### can it read my whole ALL.txt since from the beginning? |
||||
|
|
||||
|
not really. only lines in 'new' format are accepted because the old format doesnt contain the frequency and the date. |
||||
|
|
||||
|
lines in incompatible format are silently ignored. |
||||
|
|
||||
|
with alltxt2csv you can prepare your ALL.TXT from ca. mid 2019 for import to mysql. |
||||
|
|
||||
|
for prometheus it is not possible to import historical data for obivous reasons. |
||||
|
|
||||
|
### there are a lot of "cant parse callsign messages" during importing my ALL.txt |
||||
|
|
||||
|
thats quite normal as there are propably a lot of strange/broken messages in your ALL.txt ;) |
||||
|
|
||||
|
### does it work with wsjt-x 2.3.0.RC2? |
||||
|
|
||||
|
no, there is a bug which prevents the ALL.TXT to contain them timestamp, but it should be fixed in the next release. |
||||
|
|
||||
|
### what is the state of this? |
||||
|
|
||||
|
this works fine for me! but it was just build from boredom during covid lockdown and it is not to be considered as perfect. |
||||
|
performance obviously depends on your hardware and the complexity of your queries. |
||||
|
feedback and pull requests are highly appreciated! |
||||
|
|
||||
|
here be dragons: |
||||
|
* callsign lookup performance done with regex in one goroutine is unneccessary slow for alltxt2csv |
||||
|
* grids for ALL.TXT entries are always looked up by dxcc instead if being tracked in the file |
||||
|
* there is a lot of space for improvements for the dashboards |
||||
|
|
||||
|
### grafana says too many rows for mysql datasource |
||||
|
|
||||
|
try choosing a bigger interval |
||||
|
|
||||
|
### how long does it take to import my data into mysql? |
||||
|
|
||||
|
* my ALL.TXT (new format start july 2019) contains ~ 13.7 mio lines and has ~ 850M |
||||
|
* converting to csv takes ~ 12min on i7-4750HQ (2015) and the result has ~ 1.2G |
||||
|
* currently this is done using a module which uses regular expressions which is not optimial for this use case |
||||
|
* importing the csv to mysql takes ~ 3.5min |
||||
|
* querying the whole time (~ 1.5 years) in grafana takes some seconds |
||||
|
|
||||
|
### does this need a lot of ressource on my machine? |
||||
|
|
||||
|
well, it depends on your queries, but propably yes! ;) |
||||
|
|
||||
|
### when i count the decoded messages in wsjt-x manually it doesnt match the prometheus graphs |
||||
|
|
||||
|
that is correct! due to the way prometheus get the results it doesnt know the corret timestamp of the event. |
||||
|
rounding/rating does the rest. |
||||
|
|
||||
|
..in mysql it is correct! |
||||
|
|
||||
|
## howtos |
||||
|
|
||||
|
there is no special howto on integrating the components into your existing grafana/prometheus/mysql infrastructure, |
||||
|
as you should propably know how to deal with these kind of stuff.. ;) |
||||
|
|
||||
|
### howto build binaries/containers |
||||
|
|
||||
|
build binaries: |
||||
|
``` |
||||
|
go get github.com/denzs/wsjtx_dashboards |
||||
|
``` |
||||
|
|
||||
|
build docker containers: |
||||
|
``` |
||||
|
docker build Dockerfile.wsjtx-exporter . |
||||
|
docker build Dockerfile.pskreporter-exporter . |
||||
|
``` |
||||
|
|
||||
|
### to be done... |
||||
|
|
||||
|
debian/win10@wsl2 + docker-compose (historical data with mysql + alltxt2csv) |
||||
|
raspbian + docker-compose (live data with prometheus only) |
||||
|
alerting |
||||
|
|
||||
|
## Kudos to |
||||
|
|
||||
|
* WSJT-X, Grafana, Prometheus, MySQL Teams |
||||
|
* Philip Gladstone for pskreporter.info |
||||
|
* Todd Neal for his nice work on https://github.com/tzneal/ham-go |
||||
|
* Stefan Prodan for his nice work on https://github.com/stefanprodan/dockprom |
@ -0,0 +1,732 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
|
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> |
||||
|
<!--Created by yEd 3.20.1--> |
||||
|
<key attr.name="Beschreibung" attr.type="string" for="graph" id="d0"/> |
||||
|
<key for="port" id="d1" yfiles.type="portgraphics"/> |
||||
|
<key for="port" id="d2" yfiles.type="portgeometry"/> |
||||
|
<key for="port" id="d3" yfiles.type="portuserdata"/> |
||||
|
<key attr.name="url" attr.type="string" for="node" id="d4"/> |
||||
|
<key attr.name="description" attr.type="string" for="node" id="d5"/> |
||||
|
<key for="node" id="d6" yfiles.type="nodegraphics"/> |
||||
|
<key for="graphml" id="d7" yfiles.type="resources"/> |
||||
|
<key attr.name="url" attr.type="string" for="edge" id="d8"/> |
||||
|
<key attr.name="description" attr.type="string" for="edge" id="d9"/> |
||||
|
<key for="edge" id="d10" yfiles.type="edgegraphics"/> |
||||
|
<graph edgedefault="directed" id="G"> |
||||
|
<data key="d0"/> |
||||
|
<node id="n0" yfiles.foldertype="group"> |
||||
|
<data key="d4" xml:space="preserve"/> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ProxyAutoBoundsNode> |
||||
|
<y:Realizers active="0"> |
||||
|
<y:GroupNode> |
||||
|
<y:Geometry height="554.921875" width="941.2936507936508" x="0.0" y="338.70656967163086"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="2.0"/> |
||||
|
<y:NodeLabel alignment="left" autoSizePolicy="node_width" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="941.2936507936508" x="0.0" xml:space="preserve" y="0.0">. linux server</y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
|
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
|
<y:BorderInsets bottom="15" bottomF="15.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
|
</y:GroupNode> |
||||
|
<y:GroupNode> |
||||
|
<y:Geometry height="50.0" width="50.0" x="567.0" y="321.0"/> |
||||
|
<y:Fill color="#F5F5F5" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="dashed" width="1.0"/> |
||||
|
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.0" x="0.0" xml:space="preserve" y="0.0">1</y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
|
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
|
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
|
</y:GroupNode> |
||||
|
</y:Realizers> |
||||
|
</y:ProxyAutoBoundsNode> |
||||
|
</data> |
||||
|
<graph edgedefault="directed" id="n0:"> |
||||
|
<node id="n0::n0"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ShapeNode> |
||||
|
<y:Geometry height="30.0" width="880.7560430263475" x="45.537454677302435" y="375.16750717163086"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.263671875" x="421.74618557567374" xml:space="preserve" y="6.015625">nginx<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
</y:ShapeNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n0::n1" yfiles.foldertype="group"> |
||||
|
<data key="d4" xml:space="preserve"/> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ProxyAutoBoundsNode> |
||||
|
<y:Realizers active="0"> |
||||
|
<y:GroupNode> |
||||
|
<y:Geometry height="412.4609375" width="771.2936507936508" x="15.0" y="451.16750717163086"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="2.0"/> |
||||
|
<y:NodeLabel alignment="left" autoSizePolicy="node_width" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="771.2936507936508" x="0.0" xml:space="preserve" y="0.0">. docker-compose</y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
|
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
|
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
|
</y:GroupNode> |
||||
|
<y:GroupNode> |
||||
|
<y:Geometry height="50.0" width="50.0" x="749.0" y="611.0"/> |
||||
|
<y:Fill color="#F5F5F5" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="dashed" width="1.0"/> |
||||
|
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.0" x="0.0" xml:space="preserve" y="0.0">1</y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
|
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
|
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
|
</y:GroupNode> |
||||
|
</y:Realizers> |
||||
|
</y:ProxyAutoBoundsNode> |
||||
|
</data> |
||||
|
<graph edgedefault="directed" id="n0::n1:"> |
||||
|
<node id="n0::n1::n0"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ShapeNode> |
||||
|
<y:Geometry height="30.0" width="180.0" x="496.04365079365084" y="487.62844467163086"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.44140625" x="64.779296875" xml:space="preserve" y="6.015625">grafana<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
</y:ShapeNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n0::n1::n1"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ShapeNode> |
||||
|
<y:Geometry height="30.0" width="147.0" x="401.7936507936508" y="738.6284446716309"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="39.994140625" x="53.5029296875" xml:space="preserve" y="6.015625">mysql<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
</y:ShapeNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n0::n1::n2"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:GenericNode configuration="com.yworks.flowchart.dataBase"> |
||||
|
<y:Geometry height="40.0" width="100.0" x="671.2936507936508" y="564.6284446716309"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="74.21875" x="12.890625" xml:space="preserve" y="11.015625">vol_grafana<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
</y:GenericNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n0::n1::n3"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ShapeNode> |
||||
|
<y:Geometry height="30.0" width="147.0" x="397.7936507936508" y="569.6284446716309"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.515625" x="35.2421875" xml:space="preserve" y="6.015625">prometheus<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
</y:ShapeNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n0::n1::n4"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ShapeNode> |
||||
|
<y:Geometry height="30.0" width="180.0" x="30.0" y="651.6284446716309"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="90.935546875" x="44.5322265625" xml:space="preserve" y="6.015625">wsjtx-exporter<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
</y:ShapeNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n0::n1::n5"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ShapeNode> |
||||
|
<y:Geometry height="30.0" width="180.0" x="430.29365079365084" y="651.6284446716309"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="129.77734375" x="25.111328125" xml:space="preserve" y="6.015625">pskreporter-exporter<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
</y:ShapeNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n0::n1::n6"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:GenericNode configuration="com.yworks.flowchart.dataBase"> |
||||
|
<y:Geometry height="40.0" width="100.0" x="270.1468253968254" y="646.6284446716309"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="100.29296875" x="-0.146484375" xml:space="preserve" y="11.015625">vol_prometheus<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
</y:GenericNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n0::n1::n7"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:GenericNode configuration="com.yworks.flowchart.dataBase"> |
||||
|
<y:Geometry height="40.0" width="100.0" x="425.2936507936508" y="808.6284446716309"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.771484375" x="18.1142578125" xml:space="preserve" y="11.015625">vol_mysql<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
</y:GenericNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
</graph> |
||||
|
</node> |
||||
|
<node id="n0::n2"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:GenericNode configuration="com.yworks.flowchart.document"> |
||||
|
<y:Geometry height="50.0" width="80.0" x="846.2936507936508" y="477.62844467163086"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="56.74609375" x="11.626953125" xml:space="preserve" y="16.015625">htaccess<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
</y:GenericNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
</graph> |
||||
|
</node> |
||||
|
<node id="n1"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:GenericNode configuration="com.yworks.flowchart.cloud"> |
||||
|
<y:Geometry height="50.0" width="100.0" x="1001.2936507936508" y="728.6284446716309"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="75.953125" x="12.0234375" xml:space="preserve" y="16.015625">PSKreporter<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
</y:GenericNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n2" yfiles.foldertype="group"> |
||||
|
<data key="d4" xml:space="preserve"/> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ProxyAutoBoundsNode> |
||||
|
<y:Realizers active="0"> |
||||
|
<y:GroupNode> |
||||
|
<y:Geometry height="191.70656967163086" width="285.0" x="368.16547619047617" y="86.0"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="2.0"/> |
||||
|
<y:NodeLabel alignment="left" autoSizePolicy="node_width" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="285.0" x="0.0" xml:space="preserve" y="0.0">. station</y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
|
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
|
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
|
</y:GroupNode> |
||||
|
<y:GroupNode> |
||||
|
<y:Geometry height="50.0" width="50.0" x="589.5" y="-245.0"/> |
||||
|
<y:Fill color="#F5F5F5" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="dashed" width="1.0"/> |
||||
|
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.0" x="0.0" xml:space="preserve" y="0.0">1</y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
|
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
|
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
|
</y:GroupNode> |
||||
|
</y:Realizers> |
||||
|
</y:ProxyAutoBoundsNode> |
||||
|
</data> |
||||
|
<graph edgedefault="directed" id="n2:"> |
||||
|
<node id="n2::n0"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:SVGNode> |
||||
|
<y:Geometry height="53.24563217163086" width="65.0260009765625" x="453.4024757021949" y="122.4609375"/> |
||||
|
<y:Fill color="#CCCCFF" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="30.51300048828125" y="57.24563217163086"> |
||||
|
<y:LabelModel> |
||||
|
<y:SmartNodeLabelModel distance="4.0"/> |
||||
|
</y:LabelModel> |
||||
|
<y:ModelParameter> |
||||
|
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/> |
||||
|
</y:ModelParameter> |
||||
|
</y:NodeLabel> |
||||
|
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
|
<y:SVGModel svgBoundsPolicy="0"> |
||||
|
<y:SVGContent refid="1"/> |
||||
|
</y:SVGModel> |
||||
|
</y:SVGNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n2::n1"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ShapeNode> |
||||
|
<y:Geometry height="30.0" width="147.0" x="491.16547619047617" y="215.70656967163086"/> |
||||
|
<y:Fill hasColor="false" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="66.80078125" x="40.099609375" xml:space="preserve" y="6.015625">alltxt2http<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> |
||||
|
<y:Shape type="roundrectangle"/> |
||||
|
</y:ShapeNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<node id="n2::n2"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ImageNode> |
||||
|
<y:Geometry height="48.0" width="48.0" x="383.16547619047617" y="206.70656967163086"/> |
||||
|
<y:Fill color="#CCCCFF" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="22.0" y="52.0"/> |
||||
|
<y:Image alphaImage="true" refid="2"/> |
||||
|
</y:ImageNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
</graph> |
||||
|
</node> |
||||
|
<node id="n3"> |
||||
|
<data key="d5"/> |
||||
|
<data key="d6"> |
||||
|
<y:ImageNode> |
||||
|
<y:Geometry height="48.0" width="48.0" x="461.91547619047617" y="0.0"/> |
||||
|
<y:Fill color="#CCCCFF" transparent="false"/> |
||||
|
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="sandwich" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="22.0" y="52.0"/> |
||||
|
<y:Image alphaImage="true" refid="3"/> |
||||
|
</y:ImageNode> |
||||
|
</data> |
||||
|
</node> |
||||
|
<edge id="n0::n1::e0" source="n0::n1::n1" target="n0::n1::n7"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="0.0" sy="15.0" tx="0.0" ty="-20.0"/> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::n1::e1" source="n0::n1::n3" target="n0::n1::n6"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="0.0" sy="15.0" tx="0.0" ty="-20.0"> |
||||
|
<y:Point x="471.2936507936508" y="631.1284446716309"/> |
||||
|
<y:Point x="320.1468253968254" y="631.1284446716309"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::n1::e2" source="n0::n1::n0" target="n0::n1::n2"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="60.0" sy="15.0" tx="0.0" ty="-20.0"> |
||||
|
<y:Point x="646.0436507936508" y="533.1284446716309"/> |
||||
|
<y:Point x="721.2936507936508" y="533.1284446716309"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::e0" source="n0::n0" target="n0::n1::n0"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"> |
||||
|
<y:Point x="485.91547619047617" y="420.66750717163086"/> |
||||
|
<y:Point x="586.0436507936508" y="420.66750717163086"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::e1" source="n0::n0" target="n0::n2"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="293.58534767544916" sy="15.0" tx="0.0" ty="-25.0"> |
||||
|
<y:Point x="779.5008238659253" y="420.66750717163086"/> |
||||
|
<y:Point x="886.2936507936508" y="420.66750717163086"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="e0" source="n0::n1::n5" target="n1"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="45.0" sy="15.0" tx="0.0" ty="-25.0"> |
||||
|
<y:Point x="565.2936507936508" y="713.1284446716309"/> |
||||
|
<y:Point x="1051.2936507936508" y="713.1284446716309"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="dashed" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n2::e0" source="n2::n0" target="n2::n2"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="-16.256500244140625" sy="26.62281608581543" tx="0.0" ty="-24.0"> |
||||
|
<y:Point x="469.65897594633554" y="191.20656967163086"/> |
||||
|
<y:Point x="407.16547619047617" y="191.20656967163086"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n2::e1" source="n2::n0" target="n2::n1"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="16.256500244140625" sy="26.62281608581543" tx="0.0" ty="-15.0"> |
||||
|
<y:Point x="502.1719764346168" y="191.20656967163086"/> |
||||
|
<y:Point x="564.6654761904762" y="191.20656967163086"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="e1" source="n3" target="n2::n0"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="0.0" sy="24.0" tx="0.0" ty="-26.62281608581543"/> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::n1::e3" source="n0::n1::n0" target="n0::n1::n3"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="-60.0" sy="15.0" tx="0.0" ty="-15.0"> |
||||
|
<y:Point x="526.0436507936508" y="533.1284446716309"/> |
||||
|
<y:Point x="471.2936507936508" y="533.1284446716309"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::n1::e4" source="n0::n1::n5" target="n0::n1::n1"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="-45.0" sy="15.0" tx="0.0" ty="-15.0"/> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::n1::e5" source="n0::n1::n3" target="n0::n1::n4"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="-49.0" sy="15.0" tx="45.0" ty="-15.0"> |
||||
|
<y:Point x="422.2936507936508" y="615.1284446716309"/> |
||||
|
<y:Point x="165.0" y="615.1284446716309"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::n1::e6" source="n0::n1::n3" target="n0::n1::n5"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="49.0" sy="15.0" tx="0.0" ty="-15.0"/> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::n1::e7" source="n0::n1::n4" target="n0::n1::n1"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="0.0" sy="15.0" tx="-49.0" ty="-15.0"> |
||||
|
<y:Point x="120.0" y="702.1284446716309"/> |
||||
|
<y:Point x="426.2936507936508" y="702.1284446716309"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::n1::e8" source="n0::n1::n0" target="n0::n1::n1"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="0.0" sy="15.0" tx="49.00000000000006" ty="-15.0"> |
||||
|
<y:Point x="586.0436507936508" y="549.1284446716309"/> |
||||
|
<y:Point x="640.7936507936508" y="549.1284446716309"/> |
||||
|
<y:Point x="640.7936507936508" y="697.1284446716309"/> |
||||
|
<y:Point x="524.2936507936508" y="697.1284446716309"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="e2" source="n2::n2" target="n0::n0"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="0.0" sy="24.0" tx="-220.18901075658687" ty="-15.0"> |
||||
|
<y:Point x="407.16547619047617" y="308.20656967163086"/> |
||||
|
<y:Point x="265.7264654338893" y="308.20656967163086"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="75.49609375" x="-179.18704774970445" xml:space="preserve" y="46.3665149944602">use grafana<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="10.0" distanceToCenter="false" position="center" ratio="0.034937974866856535" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="n0::e2" source="n0::n0" target="n0::n1::n4"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="-293.58534767544916" sy="15.0" tx="-45.0" ty="-15.0"> |
||||
|
<y:Point x="192.330128515027" y="420.66750717163086"/> |
||||
|
<y:Point x="75.0" y="420.66750717163086"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
<edge id="e3" source="n2::n1" target="n0::n0"> |
||||
|
<data key="d9"/> |
||||
|
<data key="d10"> |
||||
|
<y:PolyLineEdge> |
||||
|
<y:Path sx="0.0" sy="15.0" tx="220.18901075658687" ty="-15.0"> |
||||
|
<y:Point x="564.6654761904762" y="308.20656967163086"/> |
||||
|
<y:Point x="706.104486947063" y="308.20656967163086"/> |
||||
|
</y:Path> |
||||
|
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
|
<y:Arrows source="none" target="standard"/> |
||||
|
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.923828125" x="-61.96190418061758" xml:space="preserve" y="29.257808685302734">push data<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel> |
||||
|
<y:BendStyle smoothed="false"/> |
||||
|
</y:PolyLineEdge> |
||||
|
</data> |
||||
|
</edge> |
||||
|
</graph> |
||||
|
<data key="d7"> |
||||
|
<y:Resources> |
||||
|
<y:Resource id="1" xml:space="preserve"><?xml version="1.0" encoding="utf-8"?> |
||||
|
<svg version="1.1" |
||||
|
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" |
||||
|
x="0px" y="0px" width="65px" height="53px" viewBox="-0.811 -0.063 65 53" enable-background="new -0.811 -0.063 65 53" |
||||
|
xml:space="preserve"> |
||||
|
<defs> |
||||
|
</defs> |
||||
|
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="220.9624" y1="824.415" x2="220.9624" y2="801.0922" gradientTransform="matrix(1 0 0 1 -195.2002 -770.8008)"> |
||||
|
<stop offset="0.0319" style="stop-color:#808080"/> |
||||
|
<stop offset="0.1229" style="stop-color:#939393"/> |
||||
|
<stop offset="0.2702" style="stop-color:#ABABAB"/> |
||||
|
<stop offset="0.4266" style="stop-color:#BCBCBC"/> |
||||
|
<stop offset="0.5968" style="stop-color:#C6C6C6"/> |
||||
|
<stop offset="0.8061" style="stop-color:#C9C9C9"/> |
||||
|
</linearGradient> |
||||
|
<path fill="url(#SVGID_1_)" d="M51.333,51.918c0.195,0.459-0.053,0.836-0.553,0.836H0.58c-0.5,0-0.604-0.272-0.232-0.605 |
||||
|
l8.023-7.191c0.373-0.334,1.086-0.605,1.586-0.605h37.255c0.498,0,1.065,0.377,1.265,0.836L51.333,51.918z"/> |
||||
|
<path fill="none" stroke="#8D8D8D" stroke-width="0.25" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" |
||||
|
M51.333,51.918c0.195,0.459-0.053,0.836-0.553,0.836H0.58c-0.5,0-0.604-0.272-0.232-0.605l8.023-7.191 |
||||
|
c0.373-0.334,1.086-0.605,1.586-0.605h37.255c0.498,0,1.065,0.377,1.265,0.836L51.333,51.918z"/> |
||||
|
<path fill="#717171" d="M32.117,50.571c0,0.25-0.205,0.454-0.455,0.454H4.024c-0.25,0-0.304-0.139-0.119-0.307l5.638-5.154 |
||||
|
c0.184-0.17,0.539-0.309,0.789-0.309h21.332c0.25,0,0.454,0.205,0.454,0.455L32.117,50.571L32.117,50.571z"/> |
||||
|
<path fill="#717171" d="M40.738,50.598c0.086,0.236,0.359,0.428,0.609,0.428h7.465c0.25,0,0.375-0.188,0.279-0.42l-2.049-4.93 |
||||
|
c-0.098-0.229-0.379-0.42-0.629-0.42h-7.17c-0.25,0-0.386,0.191-0.301,0.428L40.738,50.598z"/> |
||||
|
<path fill="#717171" d="M32.89,50.571c0,0.25,0.205,0.454,0.455,0.454h6.135c0.25,0,0.382-0.189,0.293-0.426l-0.156-0.409 |
||||
|
c-0.089-0.233-0.365-0.421-0.615-0.416l-1.045,0.021c-0.25,0.004-0.509-0.189-0.574-0.432l-0.021-0.082 |
||||
|
c-0.065-0.242-0.321-0.439-0.571-0.439h-1.316c-0.25,0-0.444,0.205-0.432,0.453l0.002,0.059c0.016,0.25-0.181,0.455-0.431,0.459 |
||||
|
l-1.269,0.021c-0.25,0.006-0.454,0.211-0.454,0.461L32.89,50.571L32.89,50.571z"/> |
||||
|
<path fill="#717171" d="M32.89,47.004c0,0.25,0.205,0.455,0.455,0.455h4.845c0.25,0,0.396-0.195,0.323-0.437l-0.402-1.333 |
||||
|
c-0.07-0.238-0.335-0.438-0.585-0.438h-4.181c-0.25,0-0.455,0.205-0.455,0.455V47.004z"/> |
||||
|
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="535.2017" y1="-1418.6563" x2="511.4634" y2="-1418.6563" gradientTransform="matrix(1 0 0 -1 -488 -1376.627)"> |
||||
|
<stop offset="0" style="stop-color:#4D4D4D"/> |
||||
|
<stop offset="1" style="stop-color:#999999"/> |
||||
|
</linearGradient> |
||||
|
<path fill="url(#SVGID_2_)" d="M47.048,40.514c0,0.965-6.758,1.404-12.371,1.404c-3.889,0-10.914-0.348-11.367-1.267 |
||||
|
c0,0.446,0,1.502,0,1.661c0,0.725,4.803,1.234,11.357,1.234c6.554,0,12.381-0.643,12.381-1.361 |
||||
|
C47.048,42.028,47.048,40.977,47.048,40.514z"/> |
||||
|
<path fill="#808080" d="M35.179,39.307c6.556,0,11.869,0.584,11.869,1.307c0,0.721-5.313,1.42-11.869,1.42 |
||||
|
c-6.701,0-11.869-0.697-11.869-1.42S28.625,39.307,35.179,39.307z"/> |
||||
|
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="525.7661" y1="-1412.6865" x2="520.77" y2="-1412.6865" gradientTransform="matrix(1 0 0 -1 -488 -1376.627)"> |
||||
|
<stop offset="0" style="stop-color:#999999"/> |
||||
|
<stop offset="0.0417" style="stop-color:#8D8D8D"/> |
||||
|
<stop offset="0.1617" style="stop-color:#717171"/> |
||||
|
<stop offset="0.2821" style="stop-color:#5D5D5D"/> |
||||
|
<stop offset="0.4021" style="stop-color:#515151"/> |
||||
|
<stop offset="0.5212" style="stop-color:#4D4D4D"/> |
||||
|
<stop offset="0.6202" style="stop-color:#565656"/> |
||||
|
<stop offset="0.7817" style="stop-color:#6E6E6E"/> |
||||
|
<stop offset="0.9844" style="stop-color:#969696"/> |
||||
|
<stop offset="1" style="stop-color:#999999"/> |
||||
|
</linearGradient> |
||||
|
<path fill="url(#SVGID_3_)" d="M37.734,40.896c0,0-1.477,0.096-2.498,0.096s-2.499-0.096-2.499-0.096v-9.768h4.997V40.896z"/> |
||||
|
<radialGradient id="SVGID_4_" cx="415.8687" cy="-1386.5146" r="24.0778" gradientTransform="matrix(1.15 0 0 -1 -453.4719 -1376.627)" gradientUnits="userSpaceOnUse"> |
||||
|
<stop offset="0" style="stop-color:#F2F2F2"/> |
||||
|
<stop offset="1" style="stop-color:#666666"/> |
||||
|
</radialGradient> |
||||
|
<path fill="url(#SVGID_4_)" d="M9.453,2.122c0-1.1,0.9-2,2-2h48.246c1.1,0,2,0.9,2,2v30.073c0,1.101-0.9,2-2,2H11.453 |
||||
|
c-1.1,0-2-0.899-2-2V2.122z"/> |
||||
|
<path fill="none" stroke="#666666" stroke-width="0.2436" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" |
||||
|
M9.453,2.122c0-1.1,0.9-2,2-2h48.246c1.1,0,2,0.9,2,2v30.073c0,1.101-0.9,2-2,2H11.453c-1.1,0-2-0.899-2-2V2.122z"/> |
||||
|
<radialGradient id="SVGID_5_" cx="402.1509" cy="-1378.3662" r="53.3339" fx="444.1083" fy="-1385.5538" gradientTransform="matrix(1.1935 0 0 -1 -443.5655 -1376.627)" gradientUnits="userSpaceOnUse"> |
||||
|
<stop offset="0" style="stop-color:#4D4D4D"/> |
||||
|
<stop offset="1" style="stop-color:#999999"/> |
||||
|
</radialGradient> |
||||
|
<path fill="url(#SVGID_5_)" d="M10.475,3.143c0-1.1,0.9-2,2-2h46.429c1.1,0,2,0.9,2,2v27.805c0,1.1-0.9,2-2,2H12.475 |
||||
|
c-1.1,0-2-0.9-2-2V3.143z"/> |
||||
|
<radialGradient id="SVGID_6_" cx="402.939" cy="-1378.4502" r="34.1874" gradientTransform="matrix(1.1923 0 0 -1 -443.8286 -1376.627)" gradientUnits="userSpaceOnUse"> |
||||
|
<stop offset="0" style="stop-color:#9CD7FF"/> |
||||
|
<stop offset="1" style="stop-color:#3C89C9"/> |
||||
|
</radialGradient> |
||||
|
<path fill="url(#SVGID_6_)" d="M11.043,3.598c0-1.1,0.9-2,2-2h45.294c1.1,0,2,0.9,2,2v26.895c0,1.1-0.9,2-2,2H13.043 |
||||
|
c-1.1,0-2-0.9-2-2V3.598z"/> |
||||
|
<path opacity="0.24" fill="#F2F2F2" d="M11.043,24.936V3.598c0-1.1,0.9-2,2-2h45.294c1.1,0,2,0.9,2,2v13.539l-23.164,4.94 |
||||
|
c-1.064,0.273-2.836,0.547-3.935,0.609L11.043,24.936z"/> |
||||
|
<path fill="#C9C9C9" d="M58.777,46.596c-0.003-0.002-0.005-0.002-0.007,0c-0.188-0.061-0.429-0.254-0.702-0.482 |
||||
|
C58.335,46.268,58.578,46.436,58.777,46.596z"/> |
||||
|
<radialGradient id="SVGID_7_" cx="450.8638" cy="1259.1514" r="6.3766" gradientTransform="matrix(1 0 0 1 -390.4004 -1211.6016)" gradientUnits="userSpaceOnUse"> |
||||
|
<stop offset="0.1939" style="stop-color:#C9C9C9"/> |
||||
|
<stop offset="0.3299" style="stop-color:#C6C6C6"/> |
||||
|
<stop offset="0.4405" style="stop-color:#BCBCBC"/> |
||||
|
<stop offset="0.5421" style="stop-color:#ABABAB"/> |
||||
|
<stop offset="0.6378" style="stop-color:#939393"/> |
||||
|
<stop offset="0.697" style="stop-color:#808080"/> |
||||
|
</radialGradient> |
||||
|
<path fill="url(#SVGID_7_)" d="M58.77,46.596c0.005,0.002,0.007,0.002,0.009,0.002c0.002,0.004,0.006,0.004,0.006,0.004 |
||||
|
c0.084,0.023,0.153,0.021,0.213-0.021c0.017-0.008,0.026-0.021,0.037-0.041c0.604-0.119,1.329-0.154,2.197-0.086 |
||||
|
c2.032,1.545,3.77,4.625,1.18,5.801c-2.048,0.929-3.543,0.783-4.722-0.485c-0.624-0.675-1.239-1.47-1.729-2.265 |
||||
|
C56.226,48.369,56.855,47.061,58.77,46.596z"/> |
||||
|
<radialGradient id="SVGID_8_" cx="603.5698" cy="1426.6348" r="3.8245" gradientTransform="matrix(0.9761 0.2173 -0.1478 0.6641 -320.0412 -1031.1759)" gradientUnits="userSpaceOnUse"> |
||||
|
<stop offset="0.1939" style="stop-color:#C9C9C9"/> |
||||
|
<stop offset="0.3739" style="stop-color:#C6C6C6"/> |
||||
|
<stop offset="0.5203" style="stop-color:#BCBCBC"/> |
||||
|
<stop offset="0.6549" style="stop-color:#ABABAB"/> |
||||
|
<stop offset="0.7816" style="stop-color:#939494"/> |
||||
|
<stop offset="0.8364" style="stop-color:#868787"/> |
||||
|
</radialGradient> |
||||
|
<path fill="url(#SVGID_8_)" d="M55.96,49.504c-0.893-1.438-1.355-2.869-0.664-3.533c0.244-0.236,0.539-0.422,0.863-0.559 |
||||
|
c0.6,0.051,1.307,0.346,1.9,0.691c0.002,0,0.005,0.004,0.007,0.006c0.272,0.229,0.519,0.426,0.702,0.482 |
||||
|
C56.855,47.061,56.226,48.369,55.96,49.504z"/> |
||||
|
<radialGradient id="SVGID_9_" cx="448.7241" cy="1259.3271" r="3.928" gradientTransform="matrix(1 0 0 1 -390.4004 -1211.6016)" gradientUnits="userSpaceOnUse"> |
||||
|
<stop offset="0.1939" style="stop-color:#C9C9C9"/> |
||||
|
<stop offset="0.3496" style="stop-color:#C6C6C6"/> |
||||
|
<stop offset="0.4761" style="stop-color:#BCBCBC"/> |
||||
|
<stop offset="0.5925" style="stop-color:#ABABAB"/> |
||||
|
<stop offset="0.702" style="stop-color:#939393"/> |
||||
|
<stop offset="0.7697" style="stop-color:#808080"/> |
||||
|
</radialGradient> |
||||
|
<path fill="url(#SVGID_9_)" d="M56.16,45.414c1.353-0.564,3.287-0.266,4.963,0.955c0.035,0.025,0.073,0.055,0.109,0.084 |
||||
|
c-0.867-0.068-1.818-0.033-2.427,0.086c-0.109-0.105-0.763-0.449-0.744-0.434C57.464,45.758,56.757,45.463,56.16,45.414z"/> |
||||
|
<path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M56.16,45.414 |
||||
|
c1.353-0.564,3.287-0.266,4.963,0.955c0.035,0.025,0.073,0.055,0.109,0.084c2.032,1.545,3.77,4.627,1.18,5.801 |
||||
|
c-2.048,0.93-3.543,0.785-4.722-0.484c-0.624-0.676-1.239-1.471-1.729-2.264c-0.892-1.438-1.354-2.871-0.664-3.533 |
||||
|
C55.541,45.734,55.835,45.549,56.16,45.414z"/> |
||||
|
<path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M58.777,46.596 |
||||
|
c0.083-0.021,0.168-0.041,0.258-0.057c0.604-0.119,1.329-0.154,2.197-0.086"/> |
||||
|
<path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M55.958,49.516 |
||||
|
c0-0.002,0.002-0.008,0.002-0.012c0.269-1.135,0.896-2.441,2.813-2.908"/> |
||||
|
<path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M58.061,46.105 |
||||
|
c-0.597-0.35-1.306-0.643-1.901-0.693"/> |
||||
|
<path fill="none" stroke="#717171" stroke-width="0.1136" stroke-linecap="round" stroke-miterlimit="10" d="M58.779,46.598 |
||||
|
c0-0.002,0-0.002-0.002-0.002c-0.199-0.16-0.441-0.328-0.709-0.482"/> |
||||
|
<path fill="#4D4D4D" d="M58.259,45.936c0.354,0.264,0.438,0.48,0.548,0.604c-0.091,0.018-0.173,0.033-0.259,0.059 |
||||
|
c-0.355-0.393-0.996-0.666-0.955-0.727C57.688,45.729,58.063,45.791,58.259,45.936z"/> |
||||
|
</svg> |
||||
|
</y:Resource> |
||||
|
<y:Resource id="2" type="java.awt.image.BufferedImage" xml:space="preserve">iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAJv0lEQVR4Xr2YCVAUZxbHx8rGBSUi |
||||
|
9yGKivcRVKKJGhUVQUFQjlFBjogwIB6ICkEFJNk1sSrllpVNKru1ERBQV4hRo4IDzAwzA2g81lXX |
||||
|
sBtccdesRjlkoLtncGDevm8EhHaubkxe1b+giqb793v9zdevRyB4DdUR6u+sjg7dRH8Q8QUTJ5Qy |
||||
|
cRH36diwZiY2opOJDVfTseGP6ZjQu0xUSDUTtfYIExkcrgoIsGef51etVpHIlooJy0DIa8ym9d3M |
||||
|
pnXAfEAiBBQABMeEARMTBnR0KNAb12LWAB0VAnQkZsNqHS1cdZVeF5gMKUIb9vl/sSLdpuPCv1In |
||||
|
RHYwmzcAE78eBsBbLBBMJIBeH0SiYsL8v2wP9nVkX++1FYhEb9Jxwv1MQlQ7kxAJzGYSAwLc4QHv |
||||
|
AtDCQKAiVj2jwgJ2glD4Bvv6gypNtHACI4r+G5MYBQbhByPQA4/LCeiIlUCHB2D8b2qC/MazOXgV |
||||
|
ExUahuAdjGgjGBXgDG9GIIxkRQu1dpk/m4dTaeI3JiN4l0H4QQmYg/cHOnQF0Gv9uug1y5PYXBaV |
||||
|
Jn7DViYpRodLBwwKcIXnJ0DSTQWviGTzmSw6OiyESYruMgzPU4AfPGY50Gv8OqlA35VsToM1tSJr |
||||
|
Yl22qB67D4YFuMAPVoDAY0KWARWytE0d/P4YNu+AAoAhPtW5l/0rchtaCHAvPG8BHvBGBOjgpUAF |
||||
|
+1aDQDCEzd1X3lVZu+fIDsBszNE/pN5uio/kBz8YASPwdLAv0KuXABW4ZBebW19OF1NcvWU5HQR+ |
||||
|
liwH5slynzYmRmma4jcAzVWAKzwXgaDFqlY/H1s2v2CmNPtwb/eJgLcsG9ILM278jKBNGCrePDxv |
||||
|
AYvhyR1YDPSqRR8NgBfe/dLGR57byhbwlmZrbqfGPn1CJOKE0GH2qRv2XJ248QKzd9cObf5Xvp03 |
||||
|
bkztvKKYpvn8Mz9NavIOJjpUhgJdevhBCFBBi561Cv1e3oXpsv072fBvS7NhpjQLQr/bf+spwhOB |
||||
|
FgTueGVgeyGgToouh5LCJbgRjMOMxXhixmBGYzwwozDuHbcSljVXeN1pKveA5kujoFVM4g5tlW6g |
||||
|
wnRUuQJV5QKMxBkYqROopY7QKXOA59UO0KWwB53CDkA5EkBhm9AnMEO6/5oxAfwbXDyQ+GNzj0BL |
||||
|
bAS0E/iXAt3q9K0HEW48gT9Ypw1YXcIcX1JMP1hQRGvnYxYW0g9WnGSKMiXaZXiMGzAPRz2Ten/e |
||||
|
WvFCoK3SvQfeDSiJK8K7ILgzqGVOCO+I4A6gU9ojeA+80hZAPuKcHn5yTcZbs2U5WmPw0yX7YX5F |
||||
|
1v2muHXdBL4VoZ9h2nu6r87Y9glCeTU2w5SQUqp4URGte7+IgoWFFCzAzCc5RsF7mHcLKN3SE3TB |
||||
|
nRb9XXFul049ahBe5gzP5U7QrXQCqHHEOGBYAkpbCmQCK8FsRU64qe4TgWmSffDZF6k3WrHrBL4t |
||||
|
hiQMqKRocS98wCmmDuHBEHw/AZiHeb+IrrnVQpbVE5d22XgpgaelbtBZ7QpdSheAWmcENgU/ApfQ |
||||
|
W3jciCCBtzTrT+bgp2JmVu5r+0kU1d6Gd0GFAqrY8Ofq08eXEoGQUqZ4cTENxgT6w8/Np+AdzKLj |
||||
|
VB7+r6P65lpfrdINYVwxBJ6DgNLmiGCWLFtmicCUqr0QfzL9mh4eu98uii0j8Icua1YhvI4Nb07A |
||||
|
J5/Sbb+kXYTncIA6T8lLAQvhFTb4ORguFvjIDtwxBs8WmCLZq72ZFvOwnez5OelpPd0/ybX7CA9z |
||||
|
8nApFVLH8Bz2cN0nhZeActg9gU/1gUfGBPrDT67KhEkY3wuZdzpQQHM8z4/sPEuL6f/0wnMV8Mmj |
||||
|
GvUCf1/hzxn+RVoFuAOp+8ObE5hY+SGUHhTd6qyvn0kEFhdTXXy6TzI7j9LqBRp+58VdYDhm2HP8 |
||||
|
DORoLe0+gZ9QmQEzxJkP/3vvhxlk338NAnZw//eeFsG/KtCJu1C2isBzEfDCpP3jRDAR8D3OPOAD |
||||
|
r19C+fR9vcBt/8UWCQyEx1g3EYEHXOHHV6bDyrrDe4lAUClzgo/A7KP64wrwHCPh+xmbTcMbFWgQ |
||||
|
zJRlK/gI4LFyvPjYjxSaABwVdObgDQjoNp9jFuoF6jzEpgUMwMut8adVuWC6ZN9fuMD3CoyrSO/O |
||||
|
+edp8iDzDCxhCs0JvNL9QvprPXxD3HSodep6Fd4CAaX1EcE0SaaQi0APPIyt2ANTq/YqEGJMQxt4 |
||||
|
4YxTy4Y3JjA3v0MhawTc+NvsoG6UhFf35Vb4+9A1OErn2iB4pyl4YwKeFbthniL3MEqM/rENxvuf |
||||
|
ogtQQGei+7qFRfTXV56Ai777VydmDYTnJEBDncBaP5FOkeyTmxIwBj9GvBtGi3fBXHnup9Az75OR |
||||
|
efkJpui9Y3Tj3GOU9p0CSjsvn27EAe7YlgtqMjrY63ee7ycd4rXz9Ha/2vpM3/sAwqWz4bkIeIjT |
||||
|
8LhM8Z76kvlA5n0gy0PfZSQEJAQkxJkH4ZfJP112S/F2wUt4ngJyq7g+AZ/KQ7Z4B57x6T6BJxl1 |
||||
|
KQ3cL+3U4vHn5ssPbk28mbegoKHW64emB26iy3+eM+t8ZoLrtylS7zPRP0ONq3pQ3ZdbqUApsOsT |
||||
|
IDWp6sODfAV64MEN41qeCi7lO8AZ41SaDI5/TQSHUwlgXyICu28Sob568lWeY0M/gaH7B8CTGivb |
||||
|
ORKhVVzgzQogtOMpFCgVgf03Igj/LryeN/xLgUdwXTCMza+vseJdB7gImIQv2zYA3uF0kk6l9PwX |
||||
|
b4G+7v/W+LfVwpKSN3DmrzEFb7HA+a3gWJqE4ChwOgk+qfS7wh2eLWB9Hd+Df8PmHlATZBkeE6sy |
||||
|
mowJWARfvh0cz6X0wY85m0B31bg/5S4woPuPQGI9is1rsDwqdgUieFcvPC+Bs1vA4dsksD+TDGWy |
||||
|
uTUWwxsSUFirQfHmPDanyfKqTI/FaHnBk/WP4A6Yuefj/ge1bhqLBdjw+u4P3cjms6gmSjPDx1Xs |
||||
|
0XAWuLhND29/NhkeKCdfMw9vVAA7bxXN5uJUbpWpAWPEu9otge8TuIACuIRixOF3eL2sv4B/jNPm |
||||
|
u2weXjVOstsTl1KVOYHe5eNwPgUcz2/ppmtG3zMNb0RAPvwGyKw92ByDKpxjhiC8yK18p6o/vDGB |
||||
|
IzK/Os7dV9o8QoFks1vlYMqmbLsTwn/sXp722CA8ZvzFxPbuWvcWw/CGBGxVCJ5t9An7S5TwbslQ |
||||
|
FIlBcIVz2fbO/gJypU+N+e7b0eQbZpTY9Mpg9mvXWFmulWv5Nl+X8u1Z08riS3V1btcR/ieocSFT |
||||
|
Zye+MjajwL9RoAIUdn9E6NC+l5FB1v8BWMniaDHQtsMAAAAASUVORK5CYII=</y:Resource> |
||||
|
<y:Resource id="3" type="java.awt.image.BufferedImage" xml:space="preserve">iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC8ElEQVR4Xu2Xy2vUUBTGx/oAEcV3 |
||||
|
a807t05Lcm87jqLu6h8griq+QFHEtRs37twoioqCSle6dScIiqIoRTeCG3FbRFpBN660U5Sq3xWD |
||||
|
ky/pzHRsJynkBwem93zn3O9MkttMqVSQMZYvRxG/FmmMloIgWIEPr1KSOQ/1Unv/cxUcJ+jB4sek |
||||
|
KLcxqT3HbiWjT+1CYjpFnLeY1l5j5iNsEZ5MKbjDulbgPpxvBdTd5T62F55gXQwMcYuLEGdZ1wzu |
||||
|
wflmmL46xz1g/ibrElSr1eUQj1HxjCnkftY2gjfnfCMsER5AzU/qMaa9sTYV1w27UTARa+DJr05f |
||||
|
MMTa2Wh3AEeo3dDXqH7C99Vm1jbE9IKdaY1se2ALa9NoZwDHGXKg/Uy1NdMLd7C2JUxfHmcjiNeG |
||||
|
sWclaxmu4zwjhFgD3Tuuw3l/jLVzAk1uJJvKe0gtYW09XMP5GMPDy3CLPuYamL/O0rmD5rYvX3Bz |
||||
|
XJ3zLK2H9ZyvB0Zvsx79n+u9WdsWPaKyCQ0/8Ca2Jw+zNoK1nI/A6XaGtXovvSdr/wtbqO1oPkWb |
||||
|
1fSpwVoNm+K8xhJqH3IzpJ3Se7F2XsD5fJSNIT657oCd0DYZwBaDFX00sw5X9Qhr5xVLyGu8KeJt |
||||
|
uVxeHdM1GMAsV3qxNskamL9ar1sgRpZis2e8OW6HB0h2RSrOR+vdSq3C3284j3iqe0e6BaV3W3Uj |
||||
|
NnzPJvANXok0nPu73IXP9zmne23t798Q1XYE/VphJR9qHad0ntf1mh6Q1xHfXDcYjHfvEKanDqUY |
||||
|
+m77wd6U9dMpazgy1UHu21Fg4DKbQnxJWfuRXAsvcb8MwEMt5JOkuSaBV4eOPbTNMIxgPUyNJ0zO |
||||
|
HuOWJddxn0wx3FCl/WNKBDSGJyXX5wLcSiMJwxzQcF2ugMGLCdP/zF9gfR7pwuv3IzaPN8yHOsfi |
||||
|
XKIfUB4APxfXsi7X8ACczz3FAFlTDJA1xQBZUwyQNcUAWVMMkDXFAFmz6AcoaJHfCrEzh4NQv0oA |
||||
|
AAAASUVORK5CYII=</y:Resource> |
||||
|
</y:Resources> |
||||
|
</data> |
||||
|
</graphml> |
After Width: | Height: | Size: 51 KiB |
@ -0,0 +1,120 @@ |
|||||
|
# assumptions/ideas |
||||
|
|
||||
|
* keep client as stupid/uncomplicated as possible |
||||
|
* noch parsing/resolving, just postition finding |
||||
|
|
||||
|
# before release |
||||
|
|
||||
|
* multiple repos? |
||||
|
* alltxt2http & http-exporter (inkl. shared/httpstuff und shared/wsjtx) |
||||
|
* pskreporter-exporter |
||||
|
* dashboards n docs |
||||
|
|
||||
|
* alltxt2csv kann weg oder? |
||||
|
* resolving lokal nur bedingt sinnvoll |
||||
|
* profitiert nicht von ggf. vorhandenen grids im cache |
||||
|
* wenn station und identifier bekannt sind, kann das auch der admin tun |
||||
|
|
||||
|
* think about: |
||||
|
* logische trennung in zeilenverarbeitung und 'spotting' (spot in mysql&prometheus exportieren) |
||||
|
* take line -> parse line -> resolve grid and lotw for line ? |
||||
|
|
||||
|
* http-exporter |
||||
|
* errorhandling |
||||
|
* db down |
||||
|
* who keeps track of the missing lines??? |
||||
|
* lookup error (not an error) |
||||
|
* add instance field to mysql |
||||
|
* what happes if no instance is provided? |
||||
|
* improve logging |
||||
|
* counter vs histogram in prometheus? |
||||
|
* http 200 OK synchron warten lassen bis alles fertig ist? |
||||
|
* scheint tendenziell eine gute idee zu sein.. wenn db problem hat, kann client aufhoeren.. |
||||
|
|
||||
|
* pskreporter-exporter |
||||
|
* implement multi callsign support |
||||
|
* test different queries vs rate limit |
||||
|
* timeout und errorhandling? |
||||
|
* steht wenn offline sehr lange bevor er stirbt |
||||
|
|
||||
|
* alltxt2http |
||||
|
* what about readall/batchmode? |
||||
|
|
||||
|
* systemd restart problematik (failed too fast oder soo ;) |
||||
|
|
||||
|
|
||||
|
* Username=Station (=~ Callsign) right?!? |
||||
|
* call und password in htacces und fertig! |
||||
|
* auth. user kann seine instance selber waehlen |
||||
|
* kollisionen ausgeschlossen ;) |
||||
|
|
||||
|
* wsjtx/http-exporter kombinieren? |
||||
|
* http oder file input? |
||||
|
|
||||
|
* fix FIXMEs |
||||
|
|
||||
|
* provide dashboards to grafana |
||||
|
|
||||
|
* vendoring |
||||
|
|
||||
|
* add howto for ubuntu/win10 |
||||
|
|
||||
|
* push images to dockerhub |
||||
|
|
||||
|
* doc |
||||
|
* german docs.. |
||||
|
* fix single tool readmes |
||||
|
* hints for using grafana |
||||
|
* intervals |
||||
|
* fold row which are not needed |
||||
|
* use filters! |
||||
|
* server und/oder skript/readme zum aufsetzen |
||||
|
|
||||
|
# later |
||||
|
|
||||
|
* http-exporter |
||||
|
|
||||
|
* alltxt2http |
||||
|
* smarter move um sich als windows dienst einzutragen |
||||
|
|
||||
|
* dashboards |
||||
|
* build combined rx/tx panels (at least map and diagram.. maybe lotw/cqrlog) :) |
||||
|
* research how to reduce result set effectively in mysql |
||||
|
|
||||
|
* primary key um band ergaenzen? |
||||
|
|
||||
|
* maybe add https://github.com/grafana/grafana/issues/8341 ? |
||||
|
|
||||
|
* endpoint |
||||
|
* no db -> client should wait! |
||||
|
|
||||
|
* add cache! |
||||
|
* store grids |
||||
|
* lookup qrz |
||||
|
* lookup lotw |
||||
|
|
||||
|
* mod_gzip nach vorne raus? |
||||
|
* alltxt2http support? |
||||
|
* nginx config |
||||
|
|
||||
|
* LOGBOOK |
||||
|
* integrate cqrlog db |
||||
|
* make some awesome queries!! :D |
||||
|
* userfriendly cqrlog backup import |
||||
|
* upload folder via webdav via user auth erreichbar |
||||
|
* logbook import job via systemd timer oder event oder so? |
||||
|
|
||||
|
* create table aus binaries nehmen? |
||||
|
* kontrolle sollte beim db admin liegen? |
||||
|
* liegt sie ja auch weiterhin aufgrund von permissions ;) |
||||
|
* der client kann es ja versuchen.. wenn er genug rechte hat, sprich ja nichts dagegen! |
||||
|
* dafuer check ob table vorhanden! |
||||
|
|
||||
|
* prometheus timestamp feature researchen |
||||
|
|
||||
|
* fix dashboards |
||||
|
* umgang mit refresh der variablen?? |
||||
|
|
||||
|
* Mail an PSKReporter |
||||
|
* Query to bunde multiple callsigns? |
||||
|
* How are the queries counted? rate per src ip or per query? |
@ -0,0 +1,21 @@ |
|||||
|
MIT License |
||||
|
|
||||
|
Copyright (c) 2016 Stefan Prodan |
||||
|
|
||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
of this software and associated documentation files (the "Software"), to deal |
||||
|
in the Software without restriction, including without limitation the rights |
||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
copies of the Software, and to permit persons to whom the Software is |
||||
|
furnished to do so, subject to the following conditions: |
||||
|
|
||||
|
The above copyright notice and this permission notice shall be included in all |
||||
|
copies or substantial portions of the Software. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
|
SOFTWARE. |
@ -0,0 +1,352 @@ |
|||||
|
dockprom |
||||
|
======== |
||||
|
|
||||
|
A monitoring solution for Docker hosts and containers with [Prometheus](https://prometheus.io/), [Grafana](http://grafana.org/), [cAdvisor](https://github.com/google/cadvisor), |
||||
|
[NodeExporter](https://github.com/prometheus/node_exporter) and alerting with [AlertManager](https://github.com/prometheus/alertmanager). |
||||
|
|
||||
|
***If you're looking for the Docker Swarm version please go to [stefanprodan/swarmprom](https://github.com/stefanprodan/swarmprom)*** |
||||
|
|
||||
|
## Install |
||||
|
|
||||
|
Clone this repository on your Docker host, cd into dockprom directory and run compose up: |
||||
|
|
||||
|
```bash |
||||
|
git clone https://github.com/stefanprodan/dockprom |
||||
|
cd dockprom |
||||
|
|
||||
|
ADMIN_USER=admin ADMIN_PASSWORD=admin docker-compose up -d |
||||
|
``` |
||||
|
|
||||
|
Prerequisites: |
||||
|
|
||||
|
* Docker Engine >= 1.13 |
||||
|
* Docker Compose >= 1.11 |
||||
|
|
||||
|
Containers: |
||||
|
|
||||
|
* Prometheus (metrics database) `http://<host-ip>:9090` |
||||
|
* Prometheus-Pushgateway (push acceptor for ephemeral and batch jobs) `http://<host-ip>:9091` |
||||
|
* AlertManager (alerts management) `http://<host-ip>:9093` |
||||
|
* Grafana (visualize metrics) `http://<host-ip>:3000` |
||||
|
* NodeExporter (host metrics collector) |
||||
|
* cAdvisor (containers metrics collector) |
||||
|
* Caddy (reverse proxy and basic auth provider for prometheus and alertmanager) |
||||
|
|
||||
|
## Setup Grafana |
||||
|
|
||||
|
Navigate to `http://<host-ip>:3000` and login with user ***admin*** password ***admin***. You can change the credentials in the compose file or by supplying the `ADMIN_USER` and `ADMIN_PASSWORD` environment variables on compose up. The config file can be added directly in grafana part like this |
||||
|
``` |
||||
|
grafana: |
||||
|
image: grafana/grafana:7.2.0 |
||||
|
env_file: |
||||
|
- config |
||||
|
|
||||
|
``` |
||||
|
and the config file format should have this content |
||||
|
``` |
||||
|
GF_SECURITY_ADMIN_USER=admin |
||||
|
GF_SECURITY_ADMIN_PASSWORD=changeme |
||||
|
GF_USERS_ALLOW_SIGN_UP=false |
||||
|
``` |
||||
|
If you want to change the password, you have to remove this entry, otherwise the change will not take effect |
||||
|
``` |
||||
|
- grafana_data:/var/lib/grafana |
||||
|
``` |
||||
|
|
||||
|
Grafana is preconfigured with dashboards and Prometheus as the default data source: |
||||
|
|
||||
|
* Name: Prometheus |
||||
|
* Type: Prometheus |
||||
|
* Url: http://prometheus:9090 |
||||
|
* Access: proxy |
||||
|
|
||||
|
***Docker Host Dashboard*** |
||||
|
|
||||
|
![Host](https://raw.githubusercontent.com/stefanprodan/dockprom/master/screens/Grafana_Docker_Host.png) |
||||
|
|
||||
|
The Docker Host Dashboard shows key metrics for monitoring the resource usage of your server: |
||||
|
|
||||
|
* Server uptime, CPU idle percent, number of CPU cores, available memory, swap and storage |
||||
|
* System load average graph, running and blocked by IO processes graph, interrupts graph |
||||
|
* CPU usage graph by mode (guest, idle, iowait, irq, nice, softirq, steal, system, user) |
||||
|
* Memory usage graph by distribution (used, free, buffers, cached) |
||||
|
* IO usage graph (read Bps, read Bps and IO time) |
||||
|
* Network usage graph by device (inbound Bps, Outbound Bps) |
||||
|
* Swap usage and activity graphs |
||||
|
|
||||
|
For storage and particularly Free Storage graph, you have to specify the fstype in grafana graph request. |
||||
|
You can find it in `grafana/dashboards/docker_host.json`, at line 480 : |
||||
|
|
||||
|
"expr": "sum(node_filesystem_free_bytes{fstype=\"btrfs\"})", |
||||
|
|
||||
|
I work on BTRFS, so i need to change `aufs` to `btrfs`. |
||||
|
|
||||
|
You can find right value for your system in Prometheus `http://<host-ip>:9090` launching this request : |
||||
|
|
||||
|
node_filesystem_free_bytes |
||||
|
|
||||
|
***Docker Containers Dashboard*** |
||||
|
|
||||
|
![Containers](https://raw.githubusercontent.com/stefanprodan/dockprom/master/screens/Grafana_Docker_Containers.png) |
||||
|
|
||||
|
The Docker Containers Dashboard shows key metrics for monitoring running containers: |
||||
|
|
||||
|
* Total containers CPU load, memory and storage usage |
||||
|
* Running containers graph, system load graph, IO usage graph |
||||
|
* Container CPU usage graph |
||||
|
* Container memory usage graph |
||||
|
* Container cached memory usage graph |
||||
|
* Container network inbound usage graph |
||||
|
* Container network outbound usage graph |
||||
|
|
||||
|
Note that this dashboard doesn't show the containers that are part of the monitoring stack. |
||||
|
|
||||
|
***Monitor Services Dashboard*** |
||||
|
|
||||
|
![Monitor Services](https://raw.githubusercontent.com/stefanprodan/dockprom/master/screens/Grafana_Prometheus.png) |
||||
|
|
||||
|
The Monitor Services Dashboard shows key metrics for monitoring the containers that make up the monitoring stack: |
||||
|
|
||||
|
* Prometheus container uptime, monitoring stack total memory usage, Prometheus local storage memory chunks and series |
||||
|
* Container CPU usage graph |
||||
|
* Container memory usage graph |
||||
|
* Prometheus chunks to persist and persistence urgency graphs |
||||
|
* Prometheus chunks ops and checkpoint duration graphs |
||||
|
* Prometheus samples ingested rate, target scrapes and scrape duration graphs |
||||
|
* Prometheus HTTP requests graph |
||||
|
* Prometheus alerts graph |
||||
|
|
||||
|
## Define alerts |
||||
|
|
||||
|
Three alert groups have been setup within the [alert.rules](https://github.com/stefanprodan/dockprom/blob/master/prometheus/alert.rules) configuration file: |
||||
|
|
||||
|
* Monitoring services alerts [targets](https://github.com/stefanprodan/dockprom/blob/master/prometheus/alert.rules#L2-L11) |
||||
|
* Docker Host alerts [host](https://github.com/stefanprodan/dockprom/blob/master/prometheus/alert.rules#L13-L40) |
||||
|
* Docker Containers alerts [containers](https://github.com/stefanprodan/dockprom/blob/master/prometheus/alert.rules#L42-L69) |
||||
|
|
||||
|
You can modify the alert rules and reload them by making a HTTP POST call to Prometheus: |
||||
|
|
||||
|
``` |
||||
|
curl -X POST http://admin:admin@<host-ip>:9090/-/reload |
||||
|
``` |
||||
|
|
||||
|
***Monitoring services alerts*** |
||||
|
|
||||
|
Trigger an alert if any of the monitoring targets (node-exporter and cAdvisor) are down for more than 30 seconds: |
||||
|
|
||||
|
```yaml |
||||
|
- alert: monitor_service_down |
||||
|
expr: up == 0 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: critical |
||||
|
annotations: |
||||
|
summary: "Monitor service non-operational" |
||||
|
description: "Service {{ $labels.instance }} is down." |
||||
|
``` |
||||
|
|
||||
|
***Docker Host alerts*** |
||||
|
|
||||
|
Trigger an alert if the Docker host CPU is under high load for more than 30 seconds: |
||||
|
|
||||
|
```yaml |
||||
|
- alert: high_cpu_load |
||||
|
expr: node_load1 > 1.5 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Server under high load" |
||||
|
description: "Docker host is under high load, the avg load 1m is at {{ $value}}. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." |
||||
|
``` |
||||
|
|
||||
|
Modify the load threshold based on your CPU cores. |
||||
|
|
||||
|
Trigger an alert if the Docker host memory is almost full: |
||||
|
|
||||
|
```yaml |
||||
|
- alert: high_memory_load |
||||
|
expr: (sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) ) / sum(node_memory_MemTotal_bytes) * 100 > 85 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Server memory is almost full" |
||||
|
description: "Docker host memory usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." |
||||
|
``` |
||||
|
|
||||
|
Trigger an alert if the Docker host storage is almost full: |
||||
|
|
||||
|
```yaml |
||||
|
- alert: high_storage_load |
||||
|
expr: (node_filesystem_size_bytes{fstype="aufs"} - node_filesystem_free_bytes{fstype="aufs"}) / node_filesystem_size_bytes{fstype="aufs"} * 100 > 85 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Server storage is almost full" |
||||
|
description: "Docker host storage usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." |
||||
|
``` |
||||
|
|
||||
|
***Docker Containers alerts*** |
||||
|
|
||||
|
Trigger an alert if a container is down for more than 30 seconds: |
||||
|
|
||||
|
```yaml |
||||
|
- alert: jenkins_down |
||||
|
expr: absent(container_memory_usage_bytes{name="jenkins"}) |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: critical |
||||
|
annotations: |
||||
|
summary: "Jenkins down" |
||||
|
description: "Jenkins container is down for more than 30 seconds." |
||||
|
``` |
||||
|
|
||||
|
Trigger an alert if a container is using more than 10% of total CPU cores for more than 30 seconds: |
||||
|
|
||||
|
```yaml |
||||
|
- alert: jenkins_high_cpu |
||||
|
expr: sum(rate(container_cpu_usage_seconds_total{name="jenkins"}[1m])) / count(node_cpu_seconds_total{mode="system"}) * 100 > 10 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Jenkins high CPU usage" |
||||
|
description: "Jenkins CPU usage is {{ humanize $value}}%." |
||||
|
``` |
||||
|
|
||||
|
Trigger an alert if a container is using more than 1.2GB of RAM for more than 30 seconds: |
||||
|
|
||||
|
```yaml |
||||
|
- alert: jenkins_high_memory |
||||
|
expr: sum(container_memory_usage_bytes{name="jenkins"}) > 1200000000 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Jenkins high memory usage" |
||||
|
description: "Jenkins memory consumption is at {{ humanize $value}}." |
||||
|
``` |
||||
|
|
||||
|
## Setup alerting |
||||
|
|
||||
|
The AlertManager service is responsible for handling alerts sent by Prometheus server. |
||||
|
AlertManager can send notifications via email, Pushover, Slack, HipChat or any other system that exposes a webhook interface. |
||||
|
A complete list of integrations can be found [here](https://prometheus.io/docs/alerting/configuration). |
||||
|
|
||||
|
You can view and silence notifications by accessing `http://<host-ip>:9093`. |
||||
|
|
||||
|
The notification receivers can be configured in [alertmanager/config.yml](https://github.com/stefanprodan/dockprom/blob/master/alertmanager/config.yml) file. |
||||
|
|
||||
|
To receive alerts via Slack you need to make a custom integration by choose ***incoming web hooks*** in your Slack team app page. |
||||
|
You can find more details on setting up Slack integration [here](http://www.robustperception.io/using-slack-with-the-alertmanager/). |
||||
|
|
||||
|
Copy the Slack Webhook URL into the ***api_url*** field and specify a Slack ***channel***. |
||||
|
|
||||
|
```yaml |
||||
|
route: |
||||
|
receiver: 'slack' |
||||
|
|
||||
|
receivers: |
||||
|
- name: 'slack' |
||||
|
slack_configs: |
||||
|
- send_resolved: true |
||||
|
text: "{{ .CommonAnnotations.description }}" |
||||
|
username: 'Prometheus' |
||||
|
channel: '#<channel>' |
||||
|
api_url: 'https://hooks.slack.com/services/<webhook-id>' |
||||
|
``` |
||||
|
|
||||
|
![Slack Notifications](https://raw.githubusercontent.com/stefanprodan/dockprom/master/screens/Slack_Notifications.png) |
||||
|
|
||||
|
## Sending metrics to the Pushgateway |
||||
|
|
||||
|
The [pushgateway](https://github.com/prometheus/pushgateway) is used to collect data from batch jobs or from services. |
||||
|
|
||||
|
To push data, simply execute: |
||||
|
|
||||
|
echo "some_metric 3.14" | curl --data-binary @- http://user:password@localhost:9091/metrics/job/some_job |
||||
|
|
||||
|
Please replace the `user:password` part with your user and password set in the initial configuration (default: `admin:admin`). |
||||
|
|
||||
|
## Updating Grafana to v5.2.2 |
||||
|
|
||||
|
[In Grafana versions >= 5.1 the id of the grafana user has been changed](http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later). Unfortunately this means that files created prior to 5.1 won’t have the correct permissions for later versions. |
||||
|
|
||||
|
| Version | User | User ID | |
||||
|
|:-------:|:-------:|:-------:| |
||||
|
| < 5.1 | grafana | 104 | |
||||
|
| \>= 5.1 | grafana | 472 | |
||||
|
|
||||
|
There are two possible solutions to this problem. |
||||
|
- Change ownership from 104 to 472 |
||||
|
- Start the upgraded container as user 104 |
||||
|
|
||||
|
##### Specifying a user in docker-compose.yml |
||||
|
|
||||
|
To change ownership of the files run your grafana container as root and modify the permissions. |
||||
|
|
||||
|
First perform a `docker-compose down` then modify your docker-compose.yml to include the `user: root` option: |
||||
|
|
||||
|
``` |
||||
|
grafana: |
||||
|
image: grafana/grafana:5.2.2 |
||||
|
container_name: grafana |
||||
|
volumes: |
||||
|
- grafana_data:/var/lib/grafana |
||||
|
- ./grafana/datasources:/etc/grafana/datasources |
||||
|
- ./grafana/dashboards:/etc/grafana/dashboards |
||||
|
- ./grafana/setup.sh:/setup.sh |
||||
|
entrypoint: /setup.sh |
||||
|
user: root |
||||
|
environment: |
||||
|
- GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin} |
||||
|
- GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin} |
||||
|
- GF_USERS_ALLOW_SIGN_UP=false |
||||
|
restart: unless-stopped |
||||
|
expose: |
||||
|
- 3000 |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
``` |
||||
|
|
||||
|
Perform a `docker-compose up -d` and then issue the following commands: |
||||
|
|
||||
|
``` |
||||
|
docker exec -it --user root grafana bash |
||||
|
|
||||
|
# in the container you just started: |
||||
|
chown -R root:root /etc/grafana && \ |
||||
|
chmod -R a+r /etc/grafana && \ |
||||
|
chown -R grafana:grafana /var/lib/grafana && \ |
||||
|
chown -R grafana:grafana /usr/share/grafana |
||||
|
``` |
||||
|
|
||||
|
To run the grafana container as `user: 104` change your `docker-compose.yml` like such: |
||||
|
|
||||
|
``` |
||||
|
grafana: |
||||
|
image: grafana/grafana:5.2.2 |
||||
|
container_name: grafana |
||||
|
volumes: |
||||
|
- grafana_data:/var/lib/grafana |
||||
|
- ./grafana/datasources:/etc/grafana/datasources |
||||
|
- ./grafana/dashboards:/etc/grafana/dashboards |
||||
|
- ./grafana/setup.sh:/setup.sh |
||||
|
entrypoint: /setup.sh |
||||
|
user: "104" |
||||
|
environment: |
||||
|
- GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin} |
||||
|
- GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin} |
||||
|
- GF_USERS_ALLOW_SIGN_UP=false |
||||
|
restart: unless-stopped |
||||
|
expose: |
||||
|
- 3000 |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
``` |
@ -0,0 +1,21 @@ |
|||||
|
#route: |
||||
|
# receiver: 'slack' |
||||
|
# |
||||
|
#receivers: |
||||
|
# - name: 'slack' |
||||
|
# slack_configs: |
||||
|
# - send_resolved: true |
||||
|
# text: "{{ .CommonAnnotations.description }}" |
||||
|
# username: 'Prometheus' |
||||
|
# channel: '#<channel-name>' |
||||
|
# api_url: 'https://hooks.slack.com/services/<webhook-id>' |
||||
|
|
||||
|
#route: |
||||
|
# receiver: 'alertmanager webhook' |
||||
|
route: |
||||
|
receiver: 'alertmanager-notifier-webhook' |
||||
|
|
||||
|
receivers: |
||||
|
- name: 'alertmanager-notifier-webhook' |
||||
|
webhook_configs: |
||||
|
- url: http://alertmanager-notifier:8899/alert |
@ -0,0 +1,39 @@ |
|||||
|
:9090 { |
||||
|
basicauth / {$ADMIN_USER} {$ADMIN_PASSWORD} |
||||
|
proxy / prometheus:9090 { |
||||
|
transparent |
||||
|
} |
||||
|
|
||||
|
errors stderr |
||||
|
tls off |
||||
|
} |
||||
|
|
||||
|
:9093 { |
||||
|
basicauth / {$ADMIN_USER} {$ADMIN_PASSWORD} |
||||
|
proxy / alertmanager:9093 { |
||||
|
transparent |
||||
|
} |
||||
|
|
||||
|
errors stderr |
||||
|
tls off |
||||
|
} |
||||
|
|
||||
|
:9091 { |
||||
|
basicauth / {$ADMIN_USER} {$ADMIN_PASSWORD} |
||||
|
proxy / pushgateway:9091 { |
||||
|
transparent |
||||
|
} |
||||
|
|
||||
|
errors stderr |
||||
|
tls off |
||||
|
} |
||||
|
|
||||
|
:3000 { |
||||
|
proxy / grafana:3000 { |
||||
|
transparent |
||||
|
websocket |
||||
|
} |
||||
|
|
||||
|
errors stderr |
||||
|
tls off |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
GF_SECURITY_ADMIN_USER=admin |
||||
|
GF_SECURITY_ADMIN_PASSWORD=changeme |
||||
|
GF_USERS_ALLOW_SIGN_UP=false |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,238 @@ |
|||||
|
version: '2.2' |
||||
|
|
||||
|
networks: |
||||
|
monitor-net: |
||||
|
driver: bridge |
||||
|
|
||||
|
volumes: |
||||
|
prometheus_data: {} |
||||
|
grafana_data: {} |
||||
|
# db_data: {} |
||||
|
|
||||
|
services: |
||||
|
|
||||
|
prometheus: |
||||
|
image: prom/prometheus:v2.22.1 |
||||
|
container_name: prometheus |
||||
|
volumes: |
||||
|
- ./prometheus:/etc/prometheus |
||||
|
- prometheus_data:/prometheus |
||||
|
command: |
||||
|
- '--config.file=/etc/prometheus/prometheus.yml' |
||||
|
- '--storage.tsdb.path=/prometheus' |
||||
|
- '--web.console.libraries=/etc/prometheus/console_libraries' |
||||
|
- '--web.console.templates=/etc/prometheus/consoles' |
||||
|
- '--storage.tsdb.retention.time=14d' |
||||
|
- '--web.enable-lifecycle' |
||||
|
restart: unless-stopped |
||||
|
expose: |
||||
|
- 9090 |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
alertmanager: |
||||
|
image: prom/alertmanager:v0.21.0 |
||||
|
container_name: alertmanager |
||||
|
volumes: |
||||
|
- ./alertmanager:/etc/alertmanager |
||||
|
command: |
||||
|
- '--config.file=/etc/alertmanager/config.yml' |
||||
|
- '--storage.path=/alertmanager' |
||||
|
restart: unless-stopped |
||||
|
expose: |
||||
|
- 9093 |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
nodeexporter: |
||||
|
image: prom/node-exporter:v1.0.1 |
||||
|
container_name: nodeexporter |
||||
|
volumes: |
||||
|
- /proc:/host/proc:ro |
||||
|
- /sys:/host/sys:ro |
||||
|
- /:/rootfs:ro |
||||
|
command: |
||||
|
- '--path.procfs=/host/proc' |
||||
|
- '--path.rootfs=/rootfs' |
||||
|
- '--path.sysfs=/host/sys' |
||||
|
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)' |
||||
|
restart: unless-stopped |
||||
|
expose: |
||||
|
- 9100 |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
cadvisor: |
||||
|
image: gcr.io/cadvisor/cadvisor:v0.38.0 |
||||
|
container_name: cadvisor |
||||
|
volumes: |
||||
|
- /:/rootfs:ro |
||||
|
- /var/run:/var/run:rw |
||||
|
- /sys:/sys:ro |
||||
|
- /var/lib/docker:/var/lib/docker:ro |
||||
|
#- /cgroup:/cgroup:ro #doesn't work on MacOS only for Linux |
||||
|
restart: unless-stopped |
||||
|
expose: |
||||
|
- 8080 |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
grafana: |
||||
|
image: grafana/grafana:7.3.1 |
||||
|
container_name: grafana |
||||
|
volumes: |
||||
|
- grafana_data:/var/lib/grafana |
||||
|
- ./grafana/provisioning:/etc/grafana/provisioning |
||||
|
environment: |
||||
|
- GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin} |
||||
|
- GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin} |
||||
|
- GF_USERS_ALLOW_SIGN_UP=false |
||||
|
- GF_RENDERING_SERVER_URL=http://grafana-image-renderer:8081/render |
||||
|
- GF_RENDERING_CALLBACK_URL=http://grafana:3000/ |
||||
|
- GF_LOG_FILTERS='rendering:debug' |
||||
|
restart: unless-stopped |
||||
|
expose: |
||||
|
- 3000 |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
pushgateway: |
||||
|
image: prom/pushgateway:v1.3.0 |
||||
|
container_name: pushgateway |
||||
|
restart: unless-stopped |
||||
|
expose: |
||||
|
- 9091 |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
caddy: |
||||
|
image: stefanprodan/caddy |
||||
|
container_name: caddy |
||||
|
ports: |
||||
|
- "3000:3000" |
||||
|
- "9090:9090" |
||||
|
- "9093:9093" |
||||
|
- "9091:9091" |
||||
|
volumes: |
||||
|
- ./caddy:/etc/caddy |
||||
|
environment: |
||||
|
- ADMIN_USER=${ADMIN_USER:-admin} |
||||
|
- ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin} |
||||
|
restart: unless-stopped |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
# alertmanager_notifier: |
||||
|
# image: ixdotai/alertmanager-notifier:latest |
||||
|
# container_name: alertmanager-notifier |
||||
|
# ports: |
||||
|
# - "8899:8899" |
||||
|
# environment: |
||||
|
# - TELEGRAM_TOKEN="1476293190:AAHIHOyZ7Zyf2V-jrEgWELy0XlWHz_7mk48" |
||||
|
# - TELEGRAM_CHAT_ID="-1001462755835" |
||||
|
# - EXCLUDE_LABELS="yes" |
||||
|
# restart: unless-stopped |
||||
|
# networks: |
||||
|
# - monitor-net |
||||
|
# labels: |
||||
|
# org.label-schema.group: "monitoring" |
||||
|
|
||||
|
grafana-image-renderer: |
||||
|
image: grafana/grafana-image-renderer:latest |
||||
|
container_name: grafana-image-renderer |
||||
|
expose: |
||||
|
- 8081 |
||||
|
environment: |
||||
|
- ENABLE_METRICS=true |
||||
|
- HTTP_HOST=grafana-image-renderer |
||||
|
- LOG_LEVEL=debug |
||||
|
restart: unless-stopped |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
db: |
||||
|
#image: mysql:5.7 |
||||
|
image: mysql:8.0.22 |
||||
|
container_name: db |
||||
|
cpus: 4.0 |
||||
|
cap_add: |
||||
|
- SYS_NICE |
||||
|
volumes: |
||||
|
# - db_data:/var/lib/mysql |
||||
|
- /home/ixyd/dev/dockprom/db:/var/lib/mysql |
||||
|
- /home/ixyd/dev/wsjtx_dashboards:/wsjtx |
||||
|
restart: always |
||||
|
environment: |
||||
|
MYSQL_ROOT_PASSWORD: verysecret |
||||
|
MYSQL_DATABASE: digimode_stats |
||||
|
MYSQL_USER: wsjtx |
||||
|
MYSQL_PASSWORD: secret |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
mysqld-exporter: |
||||
|
image: prom/mysqld-exporter |
||||
|
container_name: mysqld-exporter |
||||
|
restart: always |
||||
|
environment: |
||||
|
- DATA_SOURCE_NAME=root:verysecret@(db:3306)/digimode_stats |
||||
|
expose: |
||||
|
- 9104 |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
wsjtx_exporter: |
||||
|
image: localhost:5000/wsjtx_exporter:latest |
||||
|
container_name: wsjtx_exporter |
||||
|
volumes: |
||||
|
- /home/ixyd/.local/share/WSJT-X:/wsjtx |
||||
|
expose: |
||||
|
- 2112 |
||||
|
environment: |
||||
|
- PROMETHEUS=true |
||||
|
- MYSQL=true |
||||
|
- TRACE=true |
||||
|
- STATION=DL3SD |
||||
|
restart: unless-stopped |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
pskreporter_exporter: |
||||
|
image: localhost:5000/pskreporter_exporter:latest |
||||
|
container_name: pskreporter_exporter |
||||
|
expose: |
||||
|
- 2112 |
||||
|
environment: |
||||
|
- PROMETHEUS=true |
||||
|
- MYSQL=true |
||||
|
- TRACE=true |
||||
|
- STATION=DL3SD |
||||
|
restart: unless-stopped |
||||
|
networks: |
||||
|
- monitor-net |
||||
|
labels: |
||||
|
org.label-schema.group: "monitoring" |
||||
|
|
||||
|
|
@ -0,0 +1,12 @@ |
|||||
|
apiVersion: 1 |
||||
|
|
||||
|
providers: |
||||
|
- name: 'Prometheus' |
||||
|
orgId: 1 |
||||
|
folder: '' |
||||
|
type: file |
||||
|
disableDeletion: false |
||||
|
editable: true |
||||
|
allowUiUpdates: true |
||||
|
options: |
||||
|
path: /etc/grafana/provisioning/dashboards |
File diff suppressed because it is too large
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -0,0 +1,398 @@ |
|||||
|
{ |
||||
|
"id": null, |
||||
|
"title": "Nginx", |
||||
|
"description": "Nginx exporter metrics", |
||||
|
"tags": [ |
||||
|
"nginx" |
||||
|
], |
||||
|
"style": "dark", |
||||
|
"timezone": "browser", |
||||
|
"editable": true, |
||||
|
"hideControls": false, |
||||
|
"sharedCrosshair": true, |
||||
|
"rows": [ |
||||
|
{ |
||||
|
"collapse": false, |
||||
|
"editable": true, |
||||
|
"height": "250px", |
||||
|
"panels": [ |
||||
|
{ |
||||
|
"aliasColors": {}, |
||||
|
"bars": false, |
||||
|
"datasource": "Prometheus", |
||||
|
"decimals": 2, |
||||
|
"editable": true, |
||||
|
"error": false, |
||||
|
"fill": 1, |
||||
|
"grid": { |
||||
|
"threshold1": null, |
||||
|
"threshold1Color": "rgba(216, 200, 27, 0.27)", |
||||
|
"threshold2": null, |
||||
|
"threshold2Color": "rgba(234, 112, 112, 0.22)" |
||||
|
}, |
||||
|
"id": 3, |
||||
|
"isNew": true, |
||||
|
"legend": { |
||||
|
"alignAsTable": true, |
||||
|
"avg": true, |
||||
|
"current": true, |
||||
|
"max": true, |
||||
|
"min": true, |
||||
|
"rightSide": true, |
||||
|
"show": true, |
||||
|
"total": false, |
||||
|
"values": true |
||||
|
}, |
||||
|
"lines": true, |
||||
|
"linewidth": 2, |
||||
|
"links": [], |
||||
|
"nullPointMode": "connected", |
||||
|
"percentage": false, |
||||
|
"pointradius": 5, |
||||
|
"points": false, |
||||
|
"renderer": "flot", |
||||
|
"seriesOverrides": [], |
||||
|
"span": 12, |
||||
|
"stack": false, |
||||
|
"steppedLine": false, |
||||
|
"targets": [ |
||||
|
{ |
||||
|
"expr": "sum(irate(nginx_connections_processed_total{stage=\"any\"}[5m])) by (stage)", |
||||
|
"hide": false, |
||||
|
"interval": "", |
||||
|
"intervalFactor": 10, |
||||
|
"legendFormat": "requests", |
||||
|
"metric": "", |
||||
|
"refId": "B", |
||||
|
"step": 10 |
||||
|
} |
||||
|
], |
||||
|
"timeFrom": null, |
||||
|
"timeShift": null, |
||||
|
"title": "Requests/sec", |
||||
|
"tooltip": { |
||||
|
"msResolution": false, |
||||
|
"shared": true, |
||||
|
"sort": 0, |
||||
|
"value_type": "cumulative" |
||||
|
}, |
||||
|
"type": "graph", |
||||
|
"xaxis": { |
||||
|
"show": true |
||||
|
}, |
||||
|
"yaxes": [ |
||||
|
{ |
||||
|
"format": "short", |
||||
|
"label": null, |
||||
|
"logBase": 1, |
||||
|
"max": null, |
||||
|
"min": 0, |
||||
|
"show": true |
||||
|
}, |
||||
|
{ |
||||
|
"format": "short", |
||||
|
"label": null, |
||||
|
"logBase": 1, |
||||
|
"max": null, |
||||
|
"min": null, |
||||
|
"show": true |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"aliasColors": {}, |
||||
|
"bars": false, |
||||
|
"datasource": "Prometheus", |
||||
|
"decimals": 2, |
||||
|
"editable": true, |
||||
|
"error": false, |
||||
|
"fill": 1, |
||||
|
"grid": { |
||||
|
"threshold1": null, |
||||
|
"threshold1Color": "rgba(216, 200, 27, 0.27)", |
||||
|
"threshold2": null, |
||||
|
"threshold2Color": "rgba(234, 112, 112, 0.22)" |
||||
|
}, |
||||
|
"id": 2, |
||||
|
"isNew": true, |
||||
|
"legend": { |
||||
|
"alignAsTable": true, |
||||
|
"avg": true, |
||||
|
"current": true, |
||||
|
"max": true, |
||||
|
"min": true, |
||||
|
"rightSide": true, |
||||
|
"show": true, |
||||
|
"total": false, |
||||
|
"values": true |
||||
|
}, |
||||
|
"lines": true, |
||||
|
"linewidth": 2, |
||||
|
"links": [], |
||||
|
"nullPointMode": "connected", |
||||
|
"percentage": false, |
||||
|
"pointradius": 5, |
||||
|
"points": false, |
||||
|
"renderer": "flot", |
||||
|
"seriesOverrides": [], |
||||
|
"span": 12, |
||||
|
"stack": false, |
||||
|
"steppedLine": false, |
||||
|
"targets": [ |
||||
|
{ |
||||
|
"expr": "sum(nginx_connections_current) by (state)", |
||||
|
"interval": "", |
||||
|
"intervalFactor": 2, |
||||
|
"legendFormat": "{{state}}", |
||||
|
"metric": "", |
||||
|
"refId": "A", |
||||
|
"step": 2 |
||||
|
} |
||||
|
], |
||||
|
"timeFrom": null, |
||||
|
"timeShift": null, |
||||
|
"title": "Connections", |
||||
|
"tooltip": { |
||||
|
"msResolution": false, |
||||
|
"shared": true, |
||||
|
"sort": 0, |
||||
|
"value_type": "cumulative" |
||||
|
}, |
||||
|
"type": "graph", |
||||
|
"xaxis": { |
||||
|
"show": true |
||||
|
}, |
||||
|
"yaxes": [ |
||||
|
{ |
||||
|
"format": "short", |
||||
|
"label": null, |
||||
|
"logBase": 1, |
||||
|
"max": null, |
||||
|
"min": 0, |
||||
|
"show": true |
||||
|
}, |
||||
|
{ |
||||
|
"format": "short", |
||||
|
"label": null, |
||||
|
"logBase": 1, |
||||
|
"max": null, |
||||
|
"min": null, |
||||
|
"show": true |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"aliasColors": {}, |
||||
|
"bars": false, |
||||
|
"datasource": "Prometheus", |
||||
|
"decimals": 2, |
||||
|
"editable": true, |
||||
|
"error": false, |
||||
|
"fill": 1, |
||||
|
"grid": { |
||||
|
"threshold1": null, |
||||
|
"threshold1Color": "rgba(216, 200, 27, 0.27)", |
||||
|
"threshold2": null, |
||||
|
"threshold2Color": "rgba(234, 112, 112, 0.22)" |
||||
|
}, |
||||
|
"id": 1, |
||||
|
"isNew": true, |
||||
|
"legend": { |
||||
|
"alignAsTable": true, |
||||
|
"avg": true, |
||||
|
"current": true, |
||||
|
"max": true, |
||||
|
"min": true, |
||||
|
"rightSide": true, |
||||
|
"show": true, |
||||
|
"total": false, |
||||
|
"values": true |
||||
|
}, |
||||
|
"lines": true, |
||||
|
"linewidth": 2, |
||||
|
"links": [], |
||||
|
"nullPointMode": "connected", |
||||
|
"percentage": false, |
||||
|
"pointradius": 5, |
||||
|
"points": false, |
||||
|
"renderer": "flot", |
||||
|
"seriesOverrides": [], |
||||
|
"span": 12, |
||||
|
"stack": false, |
||||
|
"steppedLine": false, |
||||
|
"targets": [ |
||||
|
{ |
||||
|
"expr": "sum(irate(nginx_connections_processed_total{stage!=\"any\"}[5m])) by (stage)", |
||||
|
"hide": false, |
||||
|
"interval": "", |
||||
|
"intervalFactor": 10, |
||||
|
"legendFormat": "{{stage}}", |
||||
|
"metric": "", |
||||
|
"refId": "B", |
||||
|
"step": 10 |
||||
|
} |
||||
|
], |
||||
|
"timeFrom": null, |
||||
|
"timeShift": null, |
||||
|
"title": "Connections rate", |
||||
|
"tooltip": { |
||||
|
"msResolution": false, |
||||
|
"shared": true, |
||||
|
"sort": 0, |
||||
|
"value_type": "cumulative" |
||||
|
}, |
||||
|
"type": "graph", |
||||
|
"xaxis": { |
||||
|
"show": true |
||||
|
}, |
||||
|
"yaxes": [ |
||||
|
{ |
||||
|
"format": "short", |
||||
|
"label": null, |
||||
|
"logBase": 1, |
||||
|
"max": null, |
||||
|
"min": 0, |
||||
|
"show": true |
||||
|
}, |
||||
|
{ |
||||
|
"format": "short", |
||||
|
"label": null, |
||||
|
"logBase": 1, |
||||
|
"max": null, |
||||
|
"min": null, |
||||
|
"show": true |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"title": "Nginx exporter metrics" |
||||
|
}, |
||||
|
{ |
||||
|
"collapse": false, |
||||
|
"editable": true, |
||||
|
"height": "250px", |
||||
|
"panels": [ |
||||
|
{ |
||||
|
"aliasColors": {}, |
||||
|
"bars": false, |
||||
|
"datasource": null, |
||||
|
"editable": true, |
||||
|
"error": false, |
||||
|
"fill": 1, |
||||
|
"grid": { |
||||
|
"threshold1": null, |
||||
|
"threshold1Color": "rgba(216, 200, 27, 0.27)", |
||||
|
"threshold2": null, |
||||
|
"threshold2Color": "rgba(234, 112, 112, 0.22)" |
||||
|
}, |
||||
|
"id": 4, |
||||
|
"isNew": true, |
||||
|
"legend": { |
||||
|
"alignAsTable": true, |
||||
|
"avg": true, |
||||
|
"current": true, |
||||
|
"max": true, |
||||
|
"min": true, |
||||
|
"rightSide": true, |
||||
|
"show": true, |
||||
|
"total": false, |
||||
|
"values": true |
||||
|
}, |
||||
|
"lines": true, |
||||
|
"linewidth": 2, |
||||
|
"links": [], |
||||
|
"nullPointMode": "connected", |
||||
|
"percentage": false, |
||||
|
"pointradius": 5, |
||||
|
"points": false, |
||||
|
"renderer": "flot", |
||||
|
"seriesOverrides": [], |
||||
|
"span": 12, |
||||
|
"stack": false, |
||||
|
"steppedLine": false, |
||||
|
"targets": [ |
||||
|
{ |
||||
|
"expr": "sum(rate(container_cpu_usage_seconds_total{name=~\"nginx\"}[5m])) / count(node_cpu_seconds_total{mode=\"system\"}) * 100", |
||||
|
"intervalFactor": 2, |
||||
|
"legendFormat": "nginx", |
||||
|
"refId": "A", |
||||
|
"step": 2 |
||||
|
} |
||||
|
], |
||||
|
"timeFrom": null, |
||||
|
"timeShift": null, |
||||
|
"title": "CPU usage", |
||||
|
"tooltip": { |
||||
|
"msResolution": false, |
||||
|
"shared": true, |
||||
|
"sort": 0, |
||||
|
"value_type": "cumulative" |
||||
|
}, |
||||
|
"type": "graph", |
||||
|
"xaxis": { |
||||
|
"show": true |
||||
|
}, |
||||
|
"yaxes": [ |
||||
|
{ |
||||
|
"format": "short", |
||||
|
"label": null, |
||||
|
"logBase": 1, |
||||
|
"max": null, |
||||
|
"min": null, |
||||
|
"show": true |
||||
|
}, |
||||
|
{ |
||||
|
"format": "short", |
||||
|
"label": null, |
||||
|
"logBase": 1, |
||||
|
"max": null, |
||||
|
"min": null, |
||||
|
"show": true |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"title": "Nginx container metrics" |
||||
|
} |
||||
|
], |
||||
|
"time": { |
||||
|
"from": "now-15m", |
||||
|
"to": "now" |
||||
|
}, |
||||
|
"timepicker": { |
||||
|
"refresh_intervals": [ |
||||
|
"5s", |
||||
|
"10s", |
||||
|
"30s", |
||||
|
"1m", |
||||
|
"5m", |
||||
|
"15m", |
||||
|
"30m", |
||||
|
"1h", |
||||
|
"2h", |
||||
|
"1d" |
||||
|
], |
||||
|
"time_options": [ |
||||
|
"5m", |
||||
|
"15m", |
||||
|
"1h", |
||||
|
"6h", |
||||
|
"12h", |
||||
|
"24h", |
||||
|
"2d", |
||||
|
"7d", |
||||
|
"30d" |
||||
|
] |
||||
|
}, |
||||
|
"templating": { |
||||
|
"list": [] |
||||
|
}, |
||||
|
"annotations": { |
||||
|
"list": [] |
||||
|
}, |
||||
|
"refresh": "10s", |
||||
|
"schemaVersion": 12, |
||||
|
"version": 9, |
||||
|
"links": [], |
||||
|
"gnetId": null |
||||
|
} |
@ -0,0 +1,11 @@ |
|||||
|
apiVersion: 1 |
||||
|
|
||||
|
datasources: |
||||
|
- name: Prometheus |
||||
|
type: prometheus |
||||
|
access: proxy |
||||
|
orgId: 1 |
||||
|
url: http://prometheus:9090 |
||||
|
basicAuth: false |
||||
|
isDefault: true |
||||
|
editable: true |
@ -0,0 +1,70 @@ |
|||||
|
groups: |
||||
|
- name: targets |
||||
|
rules: |
||||
|
- alert: monitor_service_down |
||||
|
expr: up == 0 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: critical |
||||
|
annotations: |
||||
|
summary: "Monitor service non-operational" |
||||
|
description: "Service {{ $labels.instance }} is down." |
||||
|
|
||||
|
- name: host |
||||
|
rules: |
||||
|
- alert: high_cpu_load |
||||
|
expr: node_load1 > 1.5 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Server under high load" |
||||
|
description: "Docker host is under high load, the avg load 1m is at {{ $value}}. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." |
||||
|
|
||||
|
- alert: high_memory_load |
||||
|
expr: (sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) ) / sum(node_memory_MemTotal_bytes) * 100 > 85 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Server memory is almost full" |
||||
|
description: "Docker host memory usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." |
||||
|
|
||||
|
- alert: high_storage_load |
||||
|
expr: (node_filesystem_size_bytes{fstype="aufs"} - node_filesystem_free_bytes{fstype="aufs"}) / node_filesystem_size_bytes{fstype="aufs"} * 100 > 85 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Server storage is almost full" |
||||
|
description: "Docker host storage usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}." |
||||
|
|
||||
|
- name: containers |
||||
|
rules: |
||||
|
- alert: jenkins_down |
||||
|
expr: absent(container_memory_usage_bytes{name="jenkins"}) |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: critical |
||||
|
annotations: |
||||
|
summary: "Jenkins down" |
||||
|
description: "Jenkins container is down for more than 30 seconds." |
||||
|
|
||||
|
- alert: jenkins_high_cpu |
||||
|
expr: sum(rate(container_cpu_usage_seconds_total{name="jenkins"}[1m])) / count(node_cpu_seconds_total{mode="system"}) * 100 > 10 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Jenkins high CPU usage" |
||||
|
description: "Jenkins CPU usage is {{ humanize $value}}%." |
||||
|
|
||||
|
- alert: jenkins_high_memory |
||||
|
expr: sum(container_memory_usage_bytes{name="jenkins"}) > 1200000000 |
||||
|
for: 30s |
||||
|
labels: |
||||
|
severity: warning |
||||
|
annotations: |
||||
|
summary: "Jenkins high memory usage" |
||||
|
description: "Jenkins memory consumption is at {{ humanize $value}}." |
||||
|
|
@ -0,0 +1,67 @@ |
|||||
|
global: |
||||
|
scrape_interval: 15s |
||||
|
evaluation_interval: 15s |
||||
|
|
||||
|
# Attach these labels to any time series or alerts when communicating with |
||||
|
# external systems (federation, remote storage, Alertmanager). |
||||
|
external_labels: |
||||
|
monitor: 'docker-host-alpha' |
||||
|
|
||||
|
# Load and evaluate rules in this file every 'evaluation_interval' seconds. |
||||
|
rule_files: |
||||
|
- "alert.rules" |
||||
|
|
||||
|
# A scrape configuration containing exactly one endpoint to scrape. |
||||
|
scrape_configs: |
||||
|
- job_name: 'nodeexporter' |
||||
|
scrape_interval: 10s |
||||
|
static_configs: |
||||
|
- targets: ['nodeexporter:9100'] |
||||
|
|
||||
|
# - job_name: 'cadvisor' |
||||
|
# scrape_interval: 10s |
||||
|
# static_configs: |
||||
|
# - targets: ['cadvisor:8080'] |
||||
|
|
||||
|
- job_name: 'prometheus' |
||||
|
scrape_interval: 10s |
||||
|
static_configs: |
||||
|
- targets: ['localhost:9090'] |
||||
|
|
||||
|
- job_name: 'pushgateway' |
||||
|
scrape_interval: 10s |
||||
|
honor_labels: true |
||||
|
static_configs: |
||||
|
- targets: ['pushgateway:9091'] |
||||
|
|
||||
|
- job_name: 'wsjtx_exporter' |
||||
|
scrape_interval: 15s |
||||
|
static_configs: |
||||
|
- targets: ['wsjtx_exporter:2112'] |
||||
|
|
||||
|
- job_name: 'pskreporter_exporter' |
||||
|
scrape_interval: 300s |
||||
|
static_configs: |
||||
|
- targets: ['pskreporter_exporter:2112'] |
||||
|
|
||||
|
- job_name: 'mysqld-exporter' |
||||
|
scrape_interval: 10s |
||||
|
static_configs: |
||||
|
- targets: ['mysqld-exporter:9104'] |
||||
|
|
||||
|
alerting: |
||||
|
alertmanagers: |
||||
|
- scheme: http |
||||
|
static_configs: |
||||
|
- targets: |
||||
|
- 'alertmanager:9093' |
||||
|
|
||||
|
# - job_name: 'nginx' |
||||
|
# scrape_interval: 10s |
||||
|
# static_configs: |
||||
|
# - targets: ['nginxexporter:9113'] |
||||
|
|
||||
|
# - job_name: 'aspnetcore' |
||||
|
# scrape_interval: 10s |
||||
|
# static_configs: |
||||
|
# - targets: ['eventlog-proxy:5000', 'eventlog:5000'] |
After Width: | Height: | Size: 270 KiB |
After Width: | Height: | Size: 247 KiB |
After Width: | Height: | Size: 501 KiB |
After Width: | Height: | Size: 39 KiB |
@ -0,0 +1,21 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
RIGCTL=$(which rigctl) |
||||
|
PARAMETERS="-m 2" |
||||
|
DELAY="300" |
||||
|
|
||||
|
BANDS="14074000 21074000 28074000" |
||||
|
|
||||
|
# wait for full minute |
||||
|
sleep $(((60 - $(date +%s) % 60)-1)) |
||||
|
|
||||
|
# start switching |
||||
|
while true |
||||
|
do |
||||
|
for band in $BANDS |
||||
|
do |
||||
|
$RIGCTL $PARAMETERS F $band |
||||
|
sleep $DELAY |
||||
|
done |
||||
|
done |
||||
|
|
File diff suppressed because it is too large
@ -0,0 +1,6 @@ |
|||||
|
LOAD DATA LOCAL INFILE '/wsjtx/DL3SD.CSV' |
||||
|
INTO TABLE wsjtx_all_txt |
||||
|
FIELDS TERMINATED BY ',' |
||||
|
ENCLOSED BY '"' |
||||
|
LINES TERMINATED BY '\n' |
||||
|
(ts, station, callsign, band, continent, mode, dxcc, geohash, report, rx) |
After Width: | Height: | Size: 447 KiB |
Loading…
Reference in new issue