11 Commits
v0.2b ... v0.3a

Author SHA1 Message Date
Sven Holz
21e5627d58 ping timeout added 2022-06-20 17:06:18 +02:00
Sven Holz
7ed91947ab ping timeout added 2022-06-20 17:03:07 +02:00
Sven Holz
5c07ade336 ping timeout added 2022-06-20 15:24:17 +02:00
Sven Holz
6980539a02 ping timeout added 2022-06-20 15:21:48 +02:00
Sven Holz
99d934d041 config.ini to template 2022-06-17 00:46:26 +02:00
Sven Holz
4c5e9ceb90 fix 2022-06-17 00:46:06 +02:00
Sven Holz
5f5aea0332 renamed config.ini to config-template.ini 2022-06-17 00:36:33 +02:00
Sven Holz
b400e34c9a * v0.3
* setup-script fixed and backup added
  * fixed latency value problem (was sometimes string instead of float)
  * cleanup
2022-06-17 00:13:53 +02:00
Sven Holz
dd52e9ef41 fixes of setup script, creating better template files, ensure coorect latency output to influx 2022-06-16 23:19:53 +02:00
Sven Holz
682c943b2e fixes of setup script, creating better template files, ensure coorect latency output to influx 2022-06-16 23:19:41 +02:00
Sven Holz
c3d367c4d9 v0.2b 2022-06-15 11:59:24 +02:00
9 changed files with 92 additions and 26 deletions

4
.gitignore vendored
View File

@@ -1,3 +1,7 @@
.DS_Store
.vscode
.env
*.backup
grafana-datasource.yml
docker-compose.yml
config.ini

View File

@@ -23,6 +23,11 @@
# host2 = 8.8.4.4
# host3 = 1.1.1.1
[hosts_timeout] # OPTIONAL; ping timeout in seconds (float); default is '1'
# host1 = 1
# host2 = 0.5
# host3 = 0.2
[hosts_timer] # OPTIONAL; ping interval in seconds; default is '5'
# host1 = 1
# host2 = 3

View File

@@ -29,7 +29,7 @@ class MyInfluxDB():
writes received data to Influxdb:
host: string which includes IP or FQDN
host_location: string which includes location of the host
ping_response: string which includes the ping reply in ms
ping_response: float which includes the ping reply in ms
"""
def __init__(self):
@@ -82,7 +82,7 @@ class MyInfluxDB():
def write(self, host, host_location, ping_response):
self.host = host
self.host_location = host_location
self.ping_response = int(ping_response)
self.ping_response = float(ping_response)
self.influx_timestamp = int(time_ns())
self.data_point = Point("latency_monitor").tag("location", self.host_location).tag("host", self.host).field("latency", self.ping_response).time(self.influx_timestamp)
self.write_api.write(bucket=self.INFX_BUCKET,
@@ -100,21 +100,24 @@ class ThreadPing(Thread):
----------
db: InfluxDB Object
host: string which includes IP or FQDN
host_timeout: float which defines how long we wait for a reply
host_timer: integer which defines how often pings are send in seconds (min. 1)
host_location: string which includes location of the host
"""
def __init__(self, db, host, host_timer, host_location):
def __init__(self, db, host, host_timeout, host_timer, host_location):
Thread.__init__(self)
self.MyDB = db
self.host = host
self.host_timeout = host_timeout
self.host_timer = host_timer
self.host_location = host_location
def run(self):
self.starttime = time()
while True:
self.ping_response_list = ping(self.host, count=1)
self.ping_response = self.ping_response_list.rtt_avg_ms
self.ping_response_list = ping(self.host, timeout=self.host_timeout, count=1)
self.ping_response = "{:.2f}".format(self.ping_response_list.rtt_avg_ms)
self.MyDB.write(self.host, self.host_location, self.ping_response)
sleep(self.host_timer - ((time() - self.starttime) % 1))
@@ -129,12 +132,14 @@ def main():
## IF ENVIRONMENT VARIABLES ARE PASSED IGNORE CONFIG FILE
if 'TARGET_HOST' in os.environ:
host = os.environ['TARGET_HOST']
host_timeout = float(os.getenv('TARGET_TIMEOUT', 1))
host_timer = int(os.getenv('TARGET_TIMER', 5))
host_location = os.getenv('TARGET_LOCATION', 'unknown')
# Create Thread
print("Creating thread for: %s, with interval: %s and location: %s" %(host, host_timer, host_location))
thread = ThreadPing(MyDB, host, host_timer, host_location)
print("Creating thread for: %s, with timeout: %s, with interval: %s and location: %s" % (
host, host_timeout, host_timer, host_location))
thread = ThreadPing(MyDB, host, host_timeout, host_timer, host_location)
my_threads.append(thread)
thread.start()
@@ -149,6 +154,9 @@ def main():
# Create thread for each configured host
for key, host in host_items:
# Check if hosts timeout is set otherwise use "1" (means 1 seconds)
host_timeout = float(config.get('hosts_timeout', key, fallback=1))
# Check if hosts timer is set otherwise use "5" (means 5 seconds)
host_timer = int(config.get('hosts_timer', key, fallback=5))
@@ -156,8 +164,8 @@ def main():
host_location = config.get('hosts_location', key, fallback="unknown")
# Create Thread
print("Creating thread for: %s, with interval: %s and location: %s" %(host, host_timer, host_location))
thread = ThreadPing(MyDB, host, host_timer, host_location)
print("Creating thread for: %s, with timeout: %s, with interval: %s and location: %s" % (host, host_timeout, host_timer, host_location))
thread = ThreadPing(MyDB, host, host_timeout, host_timer, host_location)
my_threads.append(thread)
thread.start()

View File

@@ -64,6 +64,7 @@ INFLUX_TOKEN | eWOcp-MCv2Y3IJPlER7wc...ICKirhw0lwEczRNnrIoTqZAg== | InfluxDB API
INFLUX_BUCKET | latency | InfluxDB Bucket | must
INFLUX_ORG | MyOrg | InfluxDB Organization | must
TARGET_HOST | 8.8.8.8 | Monitored Host (IP/FQDN) | must
TARGET_TIMEOUT | 0.5 | ping timeout in sec. | option
TARGET_TIMER | 3 | ping frequency in sec. | option
TARGET_LOCATION | Google | decript. location | option
@@ -77,6 +78,8 @@ TARGET_LOCATION | Google | decript. location | option
See [./latency-monitor/config.ini](./latency-monitor/config.ini)
**ENV wins over file**
#### Docker-Compose Style
@@ -119,6 +122,7 @@ in the **.env** file *(env needs to be renamed to .env)* configure following var
- YOUR_BUCKET_NAME
- YOUR_ADMIN_TOKEN
- YOUR_MONITORED_TARGET
- YOUR_MONITORED_TARGET_TIMEOUT
- YOUR_MONITORED_TARGET_TIMER
- YOUR_MONITORED_TARGET_LOCATION
@@ -161,6 +165,14 @@ Just the certificates are missing look [here](#certificate)
Now run it and mybe pick a example dashboard for grafana from [here](#grafana-dashboard-examples)
#### BACKUPS FILES ???
The script will backup following files if found:
- *./docker-compose.yml*
- *./grafana/provisioning/datasources/grafana-datasource.yml*
-----
-----
@@ -181,7 +193,7 @@ You need to configure Variables in following files to make the compose work:
-----
- **docker-compose.yml** *(was docker-compose-full_stack.yml before)*
- **docker-compose.yml** *(generated from docker-compose-full_stack.yml)*
- PLACE_YOUR_FQDN_HERE (3 times)
-----
@@ -194,12 +206,13 @@ You need to configure Variables in following files to make the compose work:
- YOUR_BUCKET_NAME
- YOUR_ADMIN_TOKEN
- YOUR_MONITORED_TARGET
- YOUR_MONITORED_TARGET_TIMEOUT
- YOUR_MONITORED_TARGET_TIMER
- YOUR_MONITORED_TARGET_LOCATION
-----
- **grafana/provisioning/datasources/grafana-datasource.yml**
- **grafana/provisioning/datasources/grafana-datasource.yml** *(generated from grafana/grafana-datasource-template.yml)*
- YOUR_ADMIN_TOKEN
- YOUR_ORGANIZATION
- YOUR_BUCKET_NAME
@@ -280,6 +293,18 @@ Contributors names and contact info
## Version History
- v0.3a
- ping timeout added
- cleanup
* v0.3
* setup-script fixed and backup added
* fixed latency value problem (was sometimes string instead of float)
* cleanup
* v0.2b
* cleanup
* v0.2a
* fixed some missing variables
* fixe a missing integer declaration in latency-monitor

View File

@@ -134,6 +134,7 @@ services:
- INFLUX_BUCKET
- INFLUX_ORG
- TARGET_HOST
- TARGET_TIMEOUT
- TARGET_TIMER
- TARGET_LOCATION
networks:

1
env
View File

@@ -36,5 +36,6 @@ INFLUX_TOKEN=YOUR_ADMIN_TOKEN
INFLUX_BUCKET=YOUR_BUCKET_NAME
INFLUX_ORG=YOUR_ORGANIZATION
TARGET_HOST=YOUR_MONITORED_TARGET
TARGET_TIMEOUT=YOUR_MONITORED_TARGET_TIMEOUT
TARGET_TIMER=YOUR_MONITORED_TARGET_TIMER
TARGET_LOCATION=YOUR_MONITORED_TARGET_LOCATION

View File

@@ -23,6 +23,11 @@
# host2 = 8.8.4.4
# host3 = 1.1.1.1
[hosts_timeout] # OPTIONAL; ping timeout in seconds (float); default is '1'
# host1 = 1
# host2 = 0.5
# host3 = 0.2
[hosts_timer] # OPTIONAL; ping interval in seconds; default is '5'
# host1 = 1
# host2 = 3

View File

@@ -1,24 +1,37 @@
#!/bin/bash
# Check if .env allready exists
if ! test -e .env; then
echo "FAIL: You need to copy file env to .env and edit it!!!"
exit 1
fi
# copy compose template to final compose file (OVERWRITTEN!!!)
cp -f ./docker-compose-full_stack.yml ./docker-compose.yml
Date=`date +%Y%m%d_%H%M%s`
# locate my path
MyScriptPath=`dirname $0`
MyScriptPathContainer="$MyScriptPath/CONTAINER/"
# Check if .env allready exists
if ! test -e $MyScriptPath/.env; then
echo "FAIL: You need to copy file env to .env and edit it!!!"
exit 1
fi
# backup old compose files
cp -f $MyScriptPath/docker-compose.yml $MyScriptPath/docker-compose-$Date.backup
# copy compose template to final compose file (OVERWRITTEN!!!)
cp -f $MyScriptPath/docker-compose-full_stack.yml $MyScriptPath/docker-compose.yml
# Make relevant grafana templating direcotries
echo "MKDIR: creating $MyScriptPath/grafana/provisioning/datasources"
mkdir -p $MyScriptPath/grafana/provisioning/datasources
# backup old grafana datasource file
cp -f $MyScriptPath/grafana/provisioning/datasources/grafana-datasource.yml $MyScriptPath/grafana/grafana-datasource-$Date.backup
# copy grafana datasource file template to grafana datasource file
cp -f $MyScriptPath/grafana/grafana-datasource-template.yml $MyScriptPath/grafana/provisioning/datasources/grafana-datasource.yml
# Replace .env MyPath Path with local path if NOT changed
sed -i -e "s#/YOUR_PATH_TO_CONTAINER_STATIC_DATA#$MyScriptPathContainer#g" .env
sed -i -e "s#/YOUR_PATH_TO_CONTAINER_STATIC_DATA#$MyScriptPathContainer#g" $MyScriptPath/.env
# Read variables from .env file
source .env
source $MyScriptPath/.env
echo "INFO: MyPath is $MyPath"
@@ -35,6 +48,8 @@ echo "CHANGE: replace PLACE_YOUR_FQDN_HERE with $MyFQDN in $MyScriptPath/docker-
sed -i -e "s/PLACE_YOUR_FQDN_HERE/$MyFQDN/g" $MyScriptPath/docker-compose.yml
# Changes in grafana/provisioning/datasources/grafana-datasource.yml
echo "CHANGE: replace YOUR_INFLUXDB_URL with $INFLUX_URL in $MyScriptPath/grafana/provisioning/datasources/grafana-datasource.yml"
sed -i -e "s#YOUR_INFLUXDB_URL#$INFLUX_URL#g" $MyScriptPath/grafana/provisioning/datasources/grafana-datasource.yml
echo "CHANGE: replace YOUR_ADMIN_TOKEN with $INFLUX_TOKEN in $MyScriptPath/grafana/provisioning/datasources/grafana-datasource.yml"
sed -i -e "s/YOUR_ADMIN_TOKEN/$INFLUX_TOKEN/g" $MyScriptPath/grafana/provisioning/datasources/grafana-datasource.yml
echo "CHANGE: replace YOUR_ORGANIZATION with $INFLUX_ORG in $MyScriptPath/grafana/provisioning/datasources/grafana-datasource.yml"
@@ -45,6 +60,8 @@ sed -i -e "s/YOUR_BUCKET_NAME/$INFLUX_BUCKET/g" $MyScriptPath/grafana/provisioni
# Correct owner and permissions to satisfy the containers
echo "CHMOD: chmod -R 755 $MyPath"
chmod -R 755 $MyPath
echo "CHMOD: chmod -R 755 $MyScriptPath/grafana/provisioning"
chmod -R 755 $MyScriptPath/grafana/provisioning
echo "CHMOD: chmod 644 $MyScriptPath/grafana/provisioning/datasources/grafana-datasource.yml"
chmod 644 $MyScriptPath/grafana/provisioning/datasources/grafana-datasource.yml
echo "CHOWN: chown -R 472.472 $MyPath/grafana/var_lib"