Swirls

SWIRLS_

  • How it works
  • Pricing

56 matches

OverviewDeliver client operations10Win and grow accounts8Resolve customer issues6Create and distribute content9Run people and operations5Review money and agreements3Monitor systems and data9Compose dependable work6

56 matches

OverviewDeliver client operations10Win and grow accounts8Resolve customer issues6Create and distribute content9Run people and operations5Review money and agreements3Monitor systems and data9Compose dependable work6
← DevOpsScheduleView on GitHub

Website Uptime Monitor

Pings a URL every 15 minutes, emails an alert when it goes down.

httpswitchemail

Source

/**
 * Checks website health every 15 minutes and alerts on downtime.
 */

schedule health_check {
  label: "Health Check"
  cron: "*/15 * * * *"
}

secret monitor_config {
  vars: [MONITOR_URL]
}

workflow check_uptime {
  label: "Check Uptime"

  root {
    type: code
    label: "Prepare check"
    code: @ts {
      return { timestamp: new Date().toISOString() }
    }
    outputSchema: @json {
      {
        "type": "object",
        "properties": {
          "timestamp": { "type": "string" }
        }
      }
    }
  }

  node ping {
    type: http
    label: "Ping website"
    url: @ts { return context.secrets.monitor_config.MONITOR_URL }
    secrets: {
      monitor_config: [MONITOR_URL]
    }
    failurePolicy: {
      strategy: "fallback"
      fallbackValue: {}
    }
  }

  node evaluate {
    type: code
    label: "Evaluate response"
    code: @ts {
      var statusCode = context.nodes.ping.meta ? context.nodes.ping.meta.status : 0
      var isUp = statusCode >= 200 && statusCode < 400
      return {
        status: isUp ? "up" : "down",
        status_code: statusCode,
        timestamp: context.nodes.root.output.timestamp
      }
    }
  }

  node route {
    type: switch
    label: "Route by status"
    cases: ["up", "down"]
    router: @ts {
      return context.nodes.evaluate.output.status
    }
  }

  node log_ok {
    type: code
    label: "Log healthy"
    code: @ts {
      return {
        status: "up",
        checked_at: context.nodes.evaluate.output.timestamp
      }
    }
  }

  node alert_down {
    type: email
    label: "Send downtime alert"
    from: @ts { return "[email protected]" }
    to: @ts { return "[email protected]" }
    subject: @ts { return "ALERT: Website is DOWN" }
    text: @ts {
      return "Website is unreachable.\nStatus code: " + context.nodes.evaluate.output.status_code + "\nChecked at: " + context.nodes.evaluate.output.timestamp
    }
  }

  flow {
    root -> ping
    ping -> evaluate
    evaluate -> route
    route -["up"]-> log_ok
    route -["down"]-> alert_down
  }
}

stream uptime_checks {
  label: "Uptime checks"
  workflow: check_uptime
  version: v1

  versions: {
    v1 {
      schema: @json {
        {
          "type": "object",
          "required": ["status"],
          "properties": {
            "status": { "type": "string" },
            "checked_at": { "type": "string" },
            "status_code": { "type": "number" }
          }
        }
      }

      condition: @ts { return true }

      prepare: @ts {
        const ok = context.output.log_ok
        if (ok) return ok
        return {
          status: "down",
          checked_at: context.nodes.evaluate.output.timestamp,
          status_code: context.nodes.evaluate.output.status_code
        }
      }
    }
  }
}

trigger on_health_check {
  schedule:health_check -> check_uptime
  enabled: true
}

Flow

Trigger to workflow

health_checkschedule
check_uptime
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

Workflow nodes

CODE
Code Node
Prepare check
HTTP
HTTP Node
Ping website
CODE
Code Node
Evaluate response
SWITCH
Switch Node
Route by status
CODE
Code Node
Log healthy
EMAIL
Email Node
Send downtime alert
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.