Mastering Sampler: Real-Time Shell Command Monitoring, Visualization, and Alerts
Sampler is a lightweight tool that lets you execute shell commands, visualize their output, and set up alerts using simple YAML configurations, enabling real‑time monitoring of databases, message queues, deployment scripts, and remote servers without requiring a full‑blown monitoring stack.
What Is Sampler?
Sampler is a tool for executing shell commands, visualizing their output, and triggering alerts. Its configuration is defined in a simple YAML file.
Why Use It?
You can sample any dynamic process directly from the terminal—observe database changes, monitor MQ in‑flight messages, trigger deployment scripts, and receive notifications. If you can obtain metrics via a shell command, Sampler can immediately visualize them.
Installation
macOS
<code>brew cask install sampler</code>or
<code>sudo curl -Lo /usr/local/bin/sampler https://github.com/sqshq/sampler/releases/download/v1.0.3/sampler-1.0.3-darwin-amd64
sudo chmod +x /usr/local/bin/sampler</code>Linux
<code>sudo wget https://github.com/sqshq/sampler/releases/download/v1.0.3/sampler-1.0.3-linux-amd64 -O /usr/local/bin/sampler
sudo chmod +x /usr/local/bin/sampler</code>Note: Install the libasound2-dev system library to enable sound alerts.
Basic Usage
Define shell commands in a YAML file, run
sampler -c config.yml, and adjust component size and position in the UI.
Not a Full‑Blown Monitoring System
Sampler is a developer‑friendly tool, not a replacement for systems like Grafana + Prometheus. It requires no server, database, or deployment—just specify shell commands.
Components
Examples of component configurations (compatible with macOS):
Runchart
<code>runcharts:
- title: Search engine response time
rate-ms: 500
scale: 2
legend:
enabled: true
details: false
items:
- label: GOOGLE
sample: curl -o /dev/null -s -w '%{time_total}' https://www.google.com
color: 178
- label: YAHOO
sample: curl -o /dev/null -s -w '%{time_total}' https://search.yahoo.com
- label: BING
sample: curl -o /dev/null -s -w '%{time_total}' https://www.bing.com</code>Sparkline
<code>sparklines:
- title: CPU usage
rate-ms: 200
scale: 0
sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
- title: Free memory pages
rate-ms: 200
scale: 0
sample: memory_pressure | grep 'Pages free' | awk '{print $3}'</code>Barchart
<code>barcharts:
- title: Local network activity
rate-ms: 500
scale: 0
items:
- label: UDP bytes in
sample: nettop -J bytes_in -l 1 -m udp | awk '{sum += $4} END {print sum}'
- label: UDP bytes out
sample: nettop -J bytes_out -l 1 -m udp | awk '{sum += $4} END {print sum}'
- label: TCP bytes in
sample: nettop -J bytes_in -l 1 -m tcp | awk '{sum += $4} END {print sum}'
- label: TCP bytes out
sample: nettop -J bytes_out -l 1 -m tcp | awk '{sum += $4} END {print sum}'</code>Gauge
<code>gauges:
- title: Minute progress
rate-ms: 500
scale: 2
percent-only: false
color: 178
cur:
sample: date +%S
max:
sample: echo 60
min:
sample: echo 0
- title: Year progress
cur:
sample: date +%j
max:
sample: echo 365
min:
sample: echo 0</code>Textbox
<code>textboxes:
- title: Local weather
rate-ms: 10000
sample: curl wttr.in?0ATQF
border: false
color: 178
- title: Docker containers stats
rate-ms: 500
sample: docker stats --no-stream --format "table {{.Name}} {{.CPUPerc}} {{.MemUsage}} {{.PIDs}}"</code>Extra Features – Triggers
Triggers allow conditional actions such as visual/sound alerts or arbitrary shell commands.
<code>gauges:
- title: MINUTE PROGRESS
position: [[0, 18], [80, 0]]
cur:
sample: date +%S
max:
sample: echo 60
min:
sample: echo 0
triggers:
- title: CLOCK BELL EVERY MINUTE
condition: '[ $label == "cur" ] && [ $cur -eq 0 ] && echo 1 || echo 0'
actions:
terminal-bell: true
sound: true
visual: false
script: say -v samantha `date +%I:%M%p`</code>Interactive Shell Support
You can specify
initcommands (run once before sampling) and
transformcommands (post‑process sample output). PTY mode enables pseudo‑terminal support for commands that require a TTY.
<code>textboxes:
- title: MongoDB polling
rate-ms: 500
init: mongo --quiet --host=localhost test
sample: Date.now();
transform: echo result = $sample</code>Variables
Reusable patterns can be defined in a
variablessection and referenced with
$variable_name.
<code>variables:
mongoconnection: mongo --quiet --host=localhost test
barcharts:
- title: MongoDB documents by status
items:
- label: IN_PROGRESS
init: $mongoconnection
sample: db.getCollection('events').find({status:'IN_PROGRESS'}).count()
- label: SUCCESS
init: $mongoconnection
sample: db.getCollection('events').find({status:'SUCCESS'}).count()
- label: FAIL
init: $mongoconnection
sample: db.getCollection('events').find({status:'FAIL'}).count()</code>Real‑World Scenarios
Database connections (MySQL, PostgreSQL, MongoDB, Neo4j), Kafka lag monitoring, Docker container stats, remote SSH commands, and JMX monitoring are demonstrated with YAML snippets.
<code># MySQL example
variables:
mysql_connection: mysql -u root -s --database mysql --skip-column-names
sparklines:
- title: MySQL (random number)
pty: true
init: $mysql_connection
sample: select rand();
# PostgreSQL example
variables:
PGPASSWORD: pwd
postgres_connection: psql -h localhost -U postgres --no-align --tuples-only
sparklines:
- title: PostgreSQL (random number)
init: $postgres_connection
sample: select random();
# Kafka lag example
variables:
kafka_connection: $KAFKA_HOME/bin/kafka-consumer-groups --bootstrap-server localhost:9092
runcharts:
- title: Kafka lag per consumer group
rate-ms: 5000
items:
- label: A->B
sample: $kafka_connection --group group_a --describe | awk 'NR>1 {sum += $5} END {print sum}'
- label: B->C
sample: $kafka_connection --group group_b --describe | awk 'NR>1 {sum += $5} END {print sum}'
- label: C->D
sample: $kafka_connection --group group_c --describe | awk 'NR>1 {sum += $5} END {print sum}'</code>Efficient Ops
This public account is maintained by Xiaotianguo and friends, regularly publishing widely-read original technical articles. We focus on operations transformation and accompany you throughout your operations career, growing together happily.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.