tutorial

How to Monitor Mise-Managed Services with Vigilmon

Mise (formerly rtx) is a fast, polyglot dev tools version manager — a modern successor to asdf that handles Node.js, Python, Ruby, Go, and dozens of other ru...

Mise (formerly rtx) is a fast, polyglot dev tools version manager — a modern successor to asdf that handles Node.js, Python, Ruby, Go, and dozens of other runtimes with a single unified CLI. Teams use Mise to pin tool versions in .mise.toml, ensuring that node --version returns the same output on every developer's laptop and every CI runner.

But version consistency doesn't prevent service outages. When a Mise-managed runtime powers a production API or a shared staging server, you need uptime monitoring that catches failures from outside the process. This tutorial shows you how to set that up with Vigilmon.


Why monitor services managed by Mise?

Mise operates at the tool-version layer, but the services those tools power are fully exposed to the usual failure modes:

  • Runtime crashes — a Node.js or Python process exits and the port goes dark
  • Version drift across environments — a CI runner picks up a different Mise-resolved version than production, producing behavioral differences that only show up at runtime
  • Health degradation before failure — rising response times, intermittent errors, or memory pressure that precede an outage
  • Deployment regressions — a new version of a Mise-pinned tool changes behavior and breaks your API silently

External uptime monitoring catches all of these at the HTTP or TCP layer, independently of which runtime version is running.


What you'll need

  • A service running on a Mise-managed runtime that exposes an HTTP or TCP port
  • A free Vigilmon account

Step 1: Confirm your Mise tool versions are pinned

The first step is making sure your .mise.toml (or legacy .tool-versions) is committed and accurate. This ensures monitoring reflects a known-good baseline:

# .mise.toml
[tools]
node = "20.14.0"
python = "3.12.3"
go = "1.22.4"

Install and verify:

mise install
node --version   # v20.14.0
python --version # Python 3.12.3
go version       # go1.22.4

Pinning versions means that when a monitor alert fires, you know exactly which runtime you're debugging.


Step 2: Add a health endpoint to your service

Vigilmon needs an HTTP endpoint that returns 200 when the service is healthy. Add one to your application before setting up monitoring.

For a Node.js/Express app:

app.get('/health', (req, res) => {
  res.json({ status: 'ok', node: process.version, uptime: process.uptime() });
});

For a Python/Flask app:

import sys
@app.route('/health')
def health():
    return {'status': 'ok', 'python': sys.version}

For a Go app:

http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    fmt.Fprintf(w, `{"status":"ok","go":"%s"}`, runtime.Version())
})

Including the runtime version in the response body helps you correlate Vigilmon alerts with specific Mise-pinned tool versions during incident triage.


Step 3: Set up HTTP monitoring in Vigilmon

  1. Log in to vigilmon.online and go to Monitors → New Monitor
  2. Choose HTTP / HTTPS
  3. Enter your service URL, e.g. https://api.example.com/health
  4. Set the check interval to 1 minute
  5. Configure Expected response:
    • Status code: 200
    • (Optional) Body contains: "status":"ok"
  6. Save the monitor

Vigilmon probes from multiple regions every minute. A non-200 response or timeout opens an incident and fires your alert channel.


Step 4: Add TCP port monitoring for non-HTTP services

If your Mise-managed stack includes a database, cache, or message queue that doesn't expose HTTP, add a TCP monitor:

  1. Go to Monitors → New Monitor
  2. Choose TCP Port
  3. Enter hostname and port: db.example.com / 5432
  4. Save

Useful TCP monitors for common Mise-managed stacks:

| Service | Default port | |---|---| | PostgreSQL | 5432 | | Redis | 6379 | | MySQL | 3306 | | RabbitMQ | 5672 |


Step 5: Track key metrics

For Mise-managed services, focus monitoring on:

| Metric | What to watch for | |---|---| | HTTP uptime | Process crashes, port binding failures | | Response time (p95) | Runtime version changes that affect performance | | Response body | Silent logical regressions | | TCP port | Non-HTTP service availability |

Vigilmon stores response time history so you can compare latency before and after a Mise tool upgrade. A sudden jump in p95 after bumping node = "21.0.0" is a strong signal to investigate.


Step 6: Configure alert channels

  1. Go to Alert Channels → Add Channel
  2. Choose Webhook or Email
  3. For Slack, paste your Slack incoming webhook URL
  4. Assign the channel to your Mise service monitors
  5. Set alert trigger: fire after 1 failed check

For PagerDuty integration, use the webhook channel with your PagerDuty Events API endpoint. Vigilmon's payload includes the monitor name, failure time, and duration — enough to route to the right on-call engineer.


Step 7: Create a status page

If multiple team members rely on a shared staging or integration server running Mise-managed services, a status page removes the need for "is it down for everyone?" messages:

  1. Go to Status Pages → New Status Page
  2. Name it, e.g. "Staging API Status"
  3. Add your HTTP and TCP monitors
  4. Publish and share the URL in your team Slack or project README

Integrating Vigilmon checks into your CI pipeline

Because Mise pins tool versions in .mise.toml, CI runners and local machines run identical runtimes. You can extend this consistency to monitoring by verifying your health endpoint immediately after deployment:

# In your CI deploy script, after deploying:
mise exec -- node scripts/wait-for-health.js https://api.example.com/health

# wait-for-health.js
const url = process.argv[2];
const MAX = 30;
for (let i = 0; i < MAX; i++) {
  const res = await fetch(url).catch(() => null);
  if (res?.ok) { console.log('healthy'); process.exit(0); }
  await new Promise(r => setTimeout(r, 2000));
}
process.exit(1);

This script uses the Mise-managed Node.js version and exits non-zero if the service doesn't come healthy within 60 seconds — failing the CI run before a broken deploy reaches users.


Putting it all together

A typical Mise + Vigilmon monitoring setup:

  1. .mise.toml pins all runtime versions — reproducible builds on every machine
  2. Each service exposes a /health endpoint that reports status and runtime version
  3. Vigilmon checks the endpoint every minute from multiple regions
  4. A Slack alert channel fires on any downtime
  5. A public status page gives the team a single place to check environment health

With this setup, a Mise tool upgrade that breaks your API will show up in Vigilmon within 60 seconds — before any user reports it.


Conclusion

Mise solves the "works on my machine" problem by pinning tool versions across environments. Vigilmon solves the "down on production" problem by probing your services externally and alerting instantly. Together they give you reproducible, observable services: you know exactly which runtime version is running, and you know the moment it stops serving traffic.

Monitor your app with Vigilmon

Free plan — 5 monitors, no credit card required. Up and running in 60 seconds.

Start free →