Skip to main content

Pagerduty CLI for Humans

Project description

PDH - PagerDuty CLI for humans

Tag and build Nix

PDH is a new lightweight CLI for pagerduty interaction: uou can handle your incidents triage without leaving your terminal. It also add some nice tricks to automate the incident triage and easy the on-call burden.

See docs (TBD)

Install

Nix

If you are using cachix you can use the prebuilt packages:

cachix use pdh
nix shell github:mbovo/pdh

Arch linux

yay -S pdh

With docker

docker run -ti -v ~/.config/pdh.yaml:/root/.config/pdh.yaml --rm pdh:0.3.10 inc ls

With pip

pip install pdh>=0.3.10

From source with nix and direnv

git clone https://github.com/mbovo/pdh
direnv allow pdh
cd pdh
pdh inc ls -e

From source with devbox

git clone https://github.com/mbovo/pdh
direnv allow pdh
cd pdh
pdh inc ls -e

From source

git clone https://github.com/mbovo/pdh
cd pdh
task setup
source .venv/bin/activate
pdh inc ls -e

Usage

First of all you need to configure pdh to talk with PagerDuty's APIs:

pdh config

The wizard will prompt you for 3 settings:

  • apikey is the API key, you can generate it from the user's profile page on pagerduty website
  • email the email address of your pagerduty profile
  • uid the userID of your account (you can read it from the browser address bar when clicking on "My Profile")

Settings are persisted to ~/.config/pdh.yaml in clear.

Listing incidents

Assigned to self:

pdh inc ls

Any other incident currently outstanding:

pdh inc ls -e

Sorting incident by field

pdh inc ls --sort assignee --reverse

In case the field is not found the cli will notice you and print the list of available fields

 pdh inc ls -e --sort unkn --reverse
Invalid sort field: unkn
Available fields: id, assignee, title, status, created_at, last_status_change_at, url

You can always sort by multiple fields using comma as separator:

pdh inc ls --sort assignee,status

Auto ACK incoming incidents

Watch for new incidents every 10s and automatically set them to Acknowledged

pdh inc ls --watch --new --ack --timeout 10

List all HIGH priority incidents periodically

List incidents asssigned to all users every 5s

pdh inc ls --high --everything --watch --timeout 5

Resolve specific incidents

pdh inc resolve INCID0001 INCID0024 INCID0023

Resolve all incidents related to Backups

pdh inc ls --resolve --regexp ".*Backup.*"

Extract custom fields

You can also extract custom fields from the pagerduty json output:

You can nested fields using dot notation (i.e service.summary)

pdh inc ls -e --fields service.summary,status,title,assignee,created_at,url

To understand the available fields you can get the raw json output and inspect it:

pdh inc ls -e -o raw

Rules

PDH support custom scripting applied to your incidents list. These rules are in fact any type of executable you can run on your machine.

pdh inc apply INCID001 -s /path/to/my/script.py -s /path/to/binary

The apply subcommand will call the listed executable/script passing along a json to stdin with the incident informations. The called script can apply any type of checks/sideffects and output another json to stout to answer the call.

Even though rules can be written in any language it's very straightforward using python:

Rules: an example

An example rule can be written in python with the following lines

#!/usr/bin/env python3
from pdh import rules, Filter

@rules.rule
def main(input):
    return {i["id"]: i["summary"] for i in input}

if __name__ == "__main__":
    main()

This is the simplest rule you can write, reading the input and simply output a new dictionary with the entries. It will output something like:

 pdh inc apply Q1LNI5LNM7RZ2C Q1C5KG41H0SZAM -s ./a.py
┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ script  Q1LNI5LNM7RZ2C                                                      Q1C5KG41H0SZAM                                                                       ┃
┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ ./a.py   AWS Health Event: us-east-1 EC2 : AWS_EC2_INSTANCE_STOP_SCHEDULED   AWS Health Event: us-east-1 EC2 : AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED │
└────────┴────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────┘

The default output is table with one line for each script runned and with one column per each element in the returned object

Rules: more examples

#!/usr/bin/env python3

# Needed imports
from pdh import rules, Filter

# This annotation make the main() method parse stdin as json into the parameter called input
# All returned values are converted to json and printed to stdout
@rules.rule
def main(input):

    # Initialize PagerDuty's APIs
    api = rules.api()

    # From the given input extract only incidents with the word cassandra in title
    incs = Filter.objects(input, filters=[Filter.regexp("title", ".*EC2.*")])

    # ackwnoledge all previously filtered incidents
    api.ack(incs)

    # resolve all previously filtered incidents
    api.resolve(incs)

    # snooze all previously filtered incidents for 1h
    api.snooze(incs, duration=3600)

    # Chain a given rule, i.e call that rule with the output of this one
    # chain-loading supports only a single binary, not directories
    c = rules.chain(incs, "rules/test_chaining.sh")

    # Execute an external program and get the output/err/return code
    p: rules.ShellResponse = rules.exec('kubectl get nodes -o name')
    if p.rc > 0:
      nodes = p.stdout.split("\n")

    # if you return a dict will be rendered with each item as a column in a table
    # Othrwise will be converted as string
    return {i["id"]: i["summary"] for i in incs}


if __name__ == "__main__":
    main()

Requirements

Contributing

First of all you need to setup the dev environment, using Taskfile:

task setup

This will create a python virtualenv and install pre-commit and poetry in your system if you lack them.

License

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See for more details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pdh-0.5.0.tar.gz (28.5 kB view details)

Uploaded Source

Built Distribution

pdh-0.5.0-py3-none-any.whl (32.2 kB view details)

Uploaded Python 3

File details

Details for the file pdh-0.5.0.tar.gz.

File metadata

  • Download URL: pdh-0.5.0.tar.gz
  • Upload date:
  • Size: 28.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for pdh-0.5.0.tar.gz
Algorithm Hash digest
SHA256 44703f51c7239df69052db34d5f531d701d6e3a12983257059eb7ea874ff5127
MD5 355666310cf3e435992ed17af270a18b
BLAKE2b-256 5fed89314c361bc761ba2fba4ed1b1b7681c3c67e9f5cca7813b0add206ec8e9

See more details on using hashes here.

File details

Details for the file pdh-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: pdh-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 32.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for pdh-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d3a2bdb87c9de9399ad5c0cde0c3b63d29a0bf776def7712c57de2c63426adb1
MD5 a889ca718bf5ddaa9fcdf6a6c82967a7
BLAKE2b-256 cf9cc6cfc53e7f9236e8f5706ebfa157a0fd16a51d6871251299738b45278597

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page