1 Easy configuration: edit a JSON file
1 Multiple checks: Ping, HTTP/Rest, TCP, Process, Windows Scheduler, Windows Service, Windows Event, Windows Performance Counters, SNMP (free disk space, uptime, system time), SNTP, Oracle DB function, Oracle scheduler job, File existence, File version, WMI, (S)FTP file existence, Executable return code, SSL certificate, MSMQ, BizTalk...
1 Multiple notifications: Windows tray notification, e-mails, SMS (using a FoxBox), Android and iOS notification (using PushSafer), Jira...
1 Add your own plugins
1 Log files can be opened with LogExpert

DownloadDonate

Once again, I've developed PingMonitor for my own use. Some parameters or functions are surely missing but it already offers a lot of things... Ping was the first implemented check... This application is intended to easily and quickly replace some manual repetitive checks, not to replace professional software like Nagios.

Installation / test

Download, unzip and run PingMonitor.exe! Easy!

The sample will check if www.google.com is replying to ping...

General configuration: edit PingMonitor.exe.config

Do not discard any parameter of this file.

Restart the application after editing this file.

Name Description Default (in bold) / Sample
CheckEveryMinutes Number of minutes between two executions
5
SMTP
FromMail
DestMails
SMTPPort
SMTPUser
SMTPPass
SMTPSSL
Host of the mail server used for notifications
From e-mail address
To e-mail addresses, separated by '£'
Server port
User
Password
Enable SSL
smtp.paludour.local
noreply@dummy.com
alert1@dummy.com£alert2@dummy.com
25
MySMTPUser
MySMTPPassword
False
AlertEveryHours Number of hours between two same alerts
24
JiraURL
JiraUser
JiraPass
JiraProject
URL of the Jira server
Username
Password
Name of the Jira project
https://support.paludour.local
MyJiraUsername
MyJiraPassword
PaludourSD
CheckNetwork If True and network is down, don't execute the checks
True
FoxBoxHost
FoxBoxGsmID
FoxBoxPass
SMSNumber
Host of the FoxBox device to send SMS
Id of the SIM card slot
Password
Telephone number
foxbox.paludour.local
1
MyFoxBoxPassword
+32000000000
AllowedSSLHosts Allowed SSL hosts with non-valid SSL certificate, separated by ','
foxbox.paludour.local
LogsViewer
LogsViewerArgs
Application to view logs files
Arguments for the application
C:\LogExpert\LogExpert.exe
"{0}"
PushSaferPrivateKey Private key to use for sending notifications with PushSafer.
PushSaferPrivateKey
WirePusherPass Password used to crypt notifications with Android WirePusher. Must be the same as the one in WirePusher
WirePusherPassword
AlertSound File of the alert sound to play (.wav format only).
D:\siren.wav
Encryption If True, passwords and connection strings are encrypted in the configuration files. PingMonitor will ask you the passwords and you'll have to paste the encrypted ones in the configuration file.
False
DefaultConnectionString Connection string used by default to connect to Oracle database
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(COMMUNITY=tcp.world)(PROTOCOL=TCP)(Host=db.paludour.local)(Port=1526)))(CONNECT_DATA=(SID=palu)));Pooling=false;Persist Security Info=True;User ID=USER;Password=PASS
bCheckForUpdate If False, don't check for an update at startup (only registered version)
True
WindowsNotification If True, Windows tray notifications are enabled
True

Configure checks: edit PingMonitor.json

Common parameters

Common paramerers to all checks.

Name (bold if mandatory) Description Default (in bold) / Sample
Name Name of the check
"Name": "Name 1"
FixedTimes First check at fixed time.
MinMinutesBetweenChecks must also be set (usually to 1440 for 24 hours).
"FixedTimes": [
  "2020-01-01T09:00:00",
  "2020-01-01T14:00:00"
],
"MinMinutesBetweenChecks": 1440
MinMinutesBetweenChecks Minimum number of minutes between two checks.
If 0: the general parameter CheckEveryMinutes is used
If -1: the check is activated manually
"MinMinutesBetweenChecks": 0
NbFailsToAlert Number of consecutive fails/events to trigger the notifications
"NbFailsToAlert": 2
JiraID
JiraAssignee
ID of the Jira component
Name of the Jira assignee
"JiraID": "10153",
"JiraAssignee": "INFRA"
AlertBySMS true to alert by SMS
"AlertBySMS": false
WirePusherIDs IDs of the WirePusher clients (shown in the Android application), separated by ','
"WirePusherIDs": "ABCDEFGHI,JKLMNOPQR"
PushSaferDevices List of devices or groups (separated by '|') that will receive the notification with PushSafer (a for all)
"PushSaferDevices": "a"
AlertBySound true to alert by sound
"AlertBySound": false

Ping

Tries to ping a hostname.

"$type": "PingMonitor.CheckPing, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Host to ping
"Host": "host0.paludour.local"
Timeout Timeout in milliseconds
"Timeout": 5000

BizTalk

Counts new suspended instances for some BizTalk applications (version 2010).

"$type": "PingMonitor.CheckBizTalk, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
DBServer Host of BizTalk database
"DBServer": "host0.paludour.local"
DBName Name of BizTalk database
"DBName": "BzDatabaseName"
Applications List of applications to check (all if not set)
"Applications": ["App1", "App2"]
NBDays Count within NBDays days
"NBDays": 2.0

Database function

Call an Oracle database function and check the returned value.

"$type": "PingMonitor.CheckDBFnc, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
ConnectionString Connection string, if different as the one defined as general parameter
FncName Name of the database function to call.
"FncName": "SCHEMA.PACKAGE.FUNCTIONNAME"
DBParams Parameters to send to the function
"DBParams": [
  {
    "$type": "PingMonitor.DBParamNumber, PingMonitor",
    "ParamName": "pNumParam",
    "ParamValue": 10.0
  },
  {
    "$type": "PingMonitor.DBParamString, PingMonitor",
    "ParamName": "pStrParam",
    "ParamValue": "Text"
  }
]
Timeout Timeout in milliseconds
"Timeout": 5000
Type Defines the behaviour:
MINVAL (DB function returns NUMBER): fails if returned value is less than Param.
MAXVAL (DB function returns NUMBER): fails if returned value is greater than Param.
TXT (DB function returns VARCHAR2) and Param empty: fails if returned text is not empty.
TXT (DB function returns VARCHAR2) and Param not empty: fails if returned text is different from Param.
REGEX (DB function returns VARCHAR2) fails if returned text doesn't match Param pattern.
DELTATIME (DB function returns DATE) fails if the difference of returned date and local date is greater than Param seconds (if Param > 0, the local date is corrected with SNTP offset).
"Type": "MAXVAL"
Param See Type
"Param": "9500"

Database scheduler

Check an Oracle scheduler job.

"$type": "PingMonitor.CheckDBScheduler, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
ConnectionString Connection string, if different as the one defined as general parameter
Owner Name of the database owner of the job.
"Owner": "SCHEMA"
JobName Name of the database job.
"JobName": "MYJOB"
NbMinutesOK Fails if no success for NbMinutesOK minutes
"NbMinutesOK": 1440
NbMinutesKO Fails if errors for NbMinutesKO minutes (without newer success)
"NbMinutesKO": 1440

Event

Checks for a specific Windows Event in the last minutes.

"$type": "PingMonitor.CheckEventLog, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Hostname of the computer
"Host": "host2.paludour.local"
Path Path of the event
"Path": "System"
Query Query to find the event
$Time$ is replaced with current time minus NbMinutes
"Query": "*[System[Provider[@Name='Service Control Manager'] and (Level=4 or Level=0) and (EventID=7036) and TimeCreated[@SystemTime>='$Time$']]] and *[EventData[Data[@Name='param1'] and (Data='My Service')]] and *[EventData[Data[@Name='param2'] and (Data='running')]]"
NbMinutes Find event in the last NbMinutes minutes
"NbMinutes": 2880

Executable

Run executable and check the exit code.

"$type": "PingMonitor.CheckExe, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
FileName Filename of the executable to execute.
"FileName": "C:\\Strawberry\\perl\\bin\\perl.exe"
Arguments Arguments for the executable
"Arguments": "\"C:\\PoolConnection.pl\" --host host3.paludour.local -w 90 -c 90"
WorkingDirectory Working directory for the executable
"WorkingDirectory": "C:\\temp"
Timeout Timeout in milliseconds
"Timeout": 5000
Type Defines the behaviour:
EXITCODE: fails if exit code is different of Param.
EXITCODEVIEWOUTPUT: fails if exit code is different of Param and copy output of the executable to log files.
"Type": "EXITCODE"
Param See Type
"Param": "0"

File existence

Check for new or old files in a directory.

"$type": "PingMonitor.CheckFile, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Directory Directory to search files into
"Directory": "\\\\host4.paludour.local\\ERR"
SearchPattern Search pattern for the files
"SearchPattern": "*.txt"
Type Defines the behaviour:
FILEEXISTS and NBDays = 0: fails if it exists at least NBFiles file(s).
FILEEXISTS and NBDays > 0: fails if it exists at least NBFiles file(s) newer than NBDays days.
FILEEXISTS and NBDays < 0: fails if it exists at least NBFiles file(s) older than NBDays days.
FILENOTEXISTS and NBDays = 0: fails if there is less than NBFiles file(s).
FILENOTEXISTS and NBDays > 0: fails if there is less than NBFiles file(s) newer than NBDays days.
FILENOTEXISTS and NBDays < 0: fails if there is less than NBFiles file(s) older than NBDays days.
"Type": "FILEEXISTS"
NBDays See Type
"NBDays": 0.0
NBFiles See Type
"NBFiles": 1
MinBytes Count files with length ≥ MinBytes bytes.
"MinBytes": 0
IncludeHidden Also count hidden files.
"IncludeHidden": false
RecursiveDepth Depth of recursive search.
"RecursiveDepth": 0
MaxCount If set, stop counting after MaxCount files found.
"MaxCount": 5
KeepFileIfMatchContentRegex If set, keep only files matching Regex.
"KeepFileIfMatchContentRegex": "Regex expression"
DiscardFileIfMatchContentRegex If set, discard files matching Regex.
"DiscardFileIfMatchContentRegex": "Regex expression"
Charset Charset to use to open file for RegEx.
"Charset": "UTF-8"

File version

Check the version of a file.

"$type": "PingMonitor.CheckFileVersion, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
FileName File name to check
"FileName": "\\\\host5.paludour.local\\c$\\MyFile.exe"
Type Defines the behaviour:
MAXVERSION: fails if file version is greater than Version.
MINVERSION: fails if file version is lower than Version.
"Type": "MAXVERSION"
Version See Type
"Version": "86.0.99999.99999"
FailIfHostDown If true, fails if remote host is not responding.
"FailIfHostDown": false
Domain To connect with another user: domain
"Domain": "paludour.local"
UserName To connect with another user: user name
"UserName": "MyUsername"
Password To connect with another user: password
"Password": "MyPassword"

Group

Group several checks. Possibility to skip next checks if a fail/event occurs. Only for registered users.

MSMQ

Check Microsoft Message Queuing.

"$type": "PingMonitor.CheckMSMQ, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Hostname of the computer
"Host": "host6.paludour.local"
QueueName Name of the queue
"QueueName": "FormatName:Direct=OS:host6.paludour.local\\private$\\csout"
MaxCount Fails if number of messages is greater than MaxCount
"MaxCount": 50

Performance Monitor Counters

Check Performance Monitor Counters.

"$type": "PingMonitor.CheckPerfMon, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Hostname of the computer
"Host": "host7.paludour.local"
Category Name of the category
"Category": "Processor"
Counter Name of the counter
"Counter": "% Processor Time"
Instance Name of the instance.
Don't set for single instance counters.
Don't set to get maximum value for multi-instances counters.
"Instance": "0"
Threshold Fails if the highest value returned is greater than Threshold
"Threshold": 90.0

Plugin

Write your own .Net plugin. Only for registered users.

Process

Check if a process is running.

"$type": "PingMonitor.CheckProcess, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
ProcessName Name of the process
"ProcessName": "Notepad++"
Host Hostname of the remote computer
"Host": "host8.paludour.local"
NBProc Number of processes
"NBProc": 1

REST service / HTTP

Check the response of an HTTP query.

"$type": "PingMonitor.CheckRest, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
URL URL to query
"URL": "http://host9.paludour.local:8080"
Resource Resource / Page / Queystring
"Resource": "/RestService.svc/Test?param=value"
Type Defines the behaviour:
STATUT: fails if HTTP status is different than Param.
MAXVAL: fails if response content is greater than Param.
REGEX: fails if response doesn't match reular expression pattern Param.
"Type": "STATUT"
Param See Type
"Param": "200"

Scheduler

Check a Windows scheduled task.

"$type": "PingMonitor.CheckScheduler, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Hostname of the computer
"Host": "host10.paludour.local"
TaskName Task name
"TaskName": "\\PALUDOUR\\MyTask"
NbMinutesOK Fails if no success for NbMinutesOK minutes
"NbMinutesOK": 2880
NbMinutesKO Fails if errors for NbMinutesKO minutes (without newer success)
"NbMinutesKO": 30
ExitCode If defined, fails if application exit code is different than ExitCode
"ExitCode": 0

Service

Check the state of a Windows service. Fails if the status is not Running.

"$type": "PingMonitor.CheckService, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Hostname of the computer
"Host": "host11.paludour.local"
ServiceName Name of the service
"ServiceName": "MyService"

SNMP

Check the uptime of a server and the free disk space.

"$type": "PingMonitor.CheckSNMP, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Hostname of the computer
"Host": "host12.paludour.local"
Community SNMP community
"Community": "CoMmUnItY"
SNMPItems Items to check : uptime in days and/or free disk(s) space in GB and/or system time and/or running process
"SNMPItems": [
  {
    "$type": "PingMonitor.SNMPSysUpTime, PingMonitor",
    "DaysLimit": 15.0
  },
  {
    "$type": "PingMonitor.SNMPDiskSpace, PingMonitor",
    "DiskNumber": 1,
    "FreeGbLimit": 1.0
  },
  {
    "$type": "PingMonitor.SNMPSystemDate, PingMonitor",
    "SecondsLimit": 60,
    "WarnIfDecrease": false
  },
  {
    "$type": "PingMonitor.SNMPProcess, PingMonitor",
    "ProcessName": "Myprocessname"
  }
]

SNTP

Check the time of the computer against a time server.

"$type": "PingMonitor.CheckSNTP, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Hostname of the computer
"Host": "host13.paludour.local"
SecondsLimit Fails if the difference of returned time and local time is greater than SecondsLimit seconds.
"SecondsLimit": 60
Timeout Timeout in milliseconds
"Timeout": 5000
KeepOffset Keep the returned value to correct computer time in some other checks.
"KeepOffset": false

SSL

Check if a site's SSL certificate is valid or about to expire and optionally check the certificate thumprint.

"$type": "PingMonitor.CheckSSL, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
URL URL to check
"URL": "https://www.paludour.net"
DaysLimit Fails if certificate expires before DaysLimit days
"DaysLimit": 7
BypassDefaultProxy True to bypass the default proxy
"BypassDefaultProxy": false
Thumbprint If defined, fails if the hash of the certificate is different
"Thumbprint": "E77A08DF24E306C58A2209AEAE9F3AB03DDC104A"

TCP

Check if a server is listening to a specific TCP port.

"$type": "PingMonitor.CheckTCP, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Hostname of the computer
"Host": "host14.paludour.local"
Port Port number
"Port": 8088
Timeout Timeout in milliseconds
"Timeout": 5000

WinSCP

Check if files exist on a (S)FTP server.

"$type": "PingMonitor.CheckWinSCP, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Protocol Protocol: Ftp or Sftp
"Protocol": "Sftp"
FtpSecure None, Explicit or Implicit
"FtpSecure": "None"
Host Hostname of the server
"Host": "host15.paludour.local"
Port Port number
"Port": 2222
User Username
"User": "MyUsername"
Pass Password
"Pass": "MyPassword"
FingerPrint SSH or TLS certificate fingerprint
"FingerPrint": "ecdsa-sha2-nistp384 384 dmacFgrSsfREZc65PMD/eVffrdfGf7J6cT73FSZb7CS="
Directory Directory where to find files
"Directory": "/MyFolder"
OpenWinSCPSessionName Name of the site to open in WinSCP UI
"OpenWinSCPSessionName": "MySessionToOpen"
SearchPattern Search pattern for the files
"SearchPattern": "*.txt"
Type Defines the behaviour:
FILEEXISTS and NBDays = 0: fails if it exists at least NBFiles file(s).
FILEEXISTS and NBDays > 0: fails if it exists at least NBFiles file(s) newer than NBDays days.
FILEEXISTS and NBDays < 0: fails if it exists at least NBFiles file(s) older than NBDays days.
FILENOTEXISTS and NBDays = 0: fails if there is less than NBFiles file(s).
FILENOTEXISTS and NBDays > 0: fails if there is less than NBFiles file(s) newer than NBDays days.
FILENOTEXISTS and NBDays < 0: fails if there is less than NBFiles file(s) older than NBDays days.
"Type": "FILEEXISTS"
NBDays See Type
"NBDays": 0.0
NBFiles See Type
"NBFiles": 1
MinBytes Count files with length ≥ MinBytes bytes.
"MinBytes": 0
RecursiveDepth Depth of recursive search.
"RecursiveDepth": 0
MaxCount If set, stop counting after MaxCount files found.
"MaxCount": 5
KeepFileIfMatchContentRegex If set, keep only files matching Regex.
"KeepFileIfMatchContentRegex": "Regex expression"
DiscardFileIfMatchContentRegex If set, discard files matching Regex.
"DiscardFileIfMatchContentRegex": "Regex expression"
Charset Charset to use to open file for RegEx.
"Charset": "UTF-8"

WMI

Check Windows Management Instrumentation, Performance Monitor Counters (with Wql query).

"$type": "PingMonitor.CheckWMI, PingMonitor"
Name (bold if mandatory) Description Default (in bold) / Sample
Host Hostname of the computer
"Host": "host16.paludour.local"
Namespace Namespace
"Namespace": "root\cimv2"
Timeout Timeout in milliseconds
"Timeout": 15000
Wql SQL for WMI
"Wql": "SELECT NumberOfPooledConnections FROM Win32_PerfFormattedData_ODPNETManagedDriver_ODPNETManagedDriver"
Type Defines the behaviour:
MAX: fails if the highest value of the Property returned by Wql is greater than Threshold.
COUNT: fails if number of returned records is different than Count.
"Type": "MAX"
Property See Type
"Property": "NumberOfPooledConnections"
Threshold See Type
"Threshold": 90.0
Count See Type
"Count": 3

Notifications

Just to check that PingMonitor is still running and notifications are OK. This sends test notifications.

"$type": "PingMonitor.CheckNotifications, PingMonitor"

Remember to set MinMinutesBetweenChecks, eventually FixedTimes and, if desired, AlertBySMS, PushSaferDevices and WirePusherIDs.

FAQ / Tips

  1. Execute PingMonitor with a user which has access to all the required resources.
  2. To always show the PingMonitor icon in the traybar on Windows 10, click the little up arrow 'Show hidden icons' on the traybar. Next, click 'Customize...' and choose 'Show icon and notifications' for PingMonitor.
    To always show the PingMonitor icon in the traybar on Windows 11, go to Settings > Personalization > Taskbar > Taskbar corner overflow and enable PingMonitor.

Download

Microsoft .Net Framework 4.7.2 must be installed.

PingMonitor may not be bundled with other software, included on CDs etc, linked to from other web sites or made available for download elsewhere. Link to this page instead.

Version 1.0
PingMonitor.zip (14 MB) for Windows 11, Windows 10.

Donate

If you have tried PingMonitor and want to support its development, make a donation; give what you wish (minimum 6 EUR or 9 USD for personal use). When I receive a donation, I send your registration key.

It's fast and easy. Just click on the 'PayPal' button below.

Thanks, Paludour.

Links / Credits

Simonis Design
LogExpert
Jira
FoxBox
PushSafer
WirePusher


Last updated: 2/2023.