Skip to main content

A natural shell for debugging Juju Kubernetes workload containers via Pebble

Project description

borescope

A natural shell for debugging Juju Kubernetes workload containers.

Kubernetes charm workload containers usually run a rock with no shell — so when something breaks, juju ssh --container=workload … drops you nowhere useful. borescope gives you a prompt that feels like bash but talks to the container's Pebble instead of a real shell:

$ borescope myapp/0
pebble:/# ls /var/log/myapp
pebble:/# tail -f /var/log/myapp/error.log
pebble:/# services
pebble:/# logs --follow myapp
pebble:/# plan
pebble:/# exit

No setup ceremony: borescope picks up your current Juju controller/model and uses your existing juju authority — if you can juju ssh to the unit, borescope works; if you can't, it fails the same way.

Install

From the snap store:

sudo snap install borescope

A few things to know about the snap:

  • It bundles its own juju (currently juju/4/stable), so it works even without juju installed on the host.
  • It reads your ~/.local/share/juju (JUJU_DATA) read-only via the auto-connecting juju-client-observe interface, then copies it into a writable per-snap directory at startup. Run juju login / juju switch outside borescope — changes made inside a borescope session don't propagate back to the host JUJU_DATA.

Or from PyPI:

uv tool install borescope    # or: uvx borescope, pipx install borescope

Usage

borescope <unit>                       # default (first) workload container
borescope <unit> --container=<name>    # a specific workload container
borescope --model <model> <unit>
borescope <unit> --command "services"  # one-shot, no REPL (for scripts)
borescope <unit> --snapshot            # dump container state as JSON

Documentation

Full documentation — a tutorial, how-to guides, and CLI/command reference — is at https://tonyandrewmeyer.github.io/borescope/.

The docs are plain Markdown under docs/src/, built into static HTML with a small script (no docs framework). To build them locally:

uv run python docs/src/_build.py     # or: tox -e docs

See docs/README.md for the authoring rules.

How it works

borescope is three thin, independently-testable layers:

  • Transport — talks to a Pebble. The primary backend (CliTransport) reaches the workload's Pebble through the charm containerjuju ssh <unit> (the charm container always has a shell) pointed at the workload's socket, which Juju mounts there at /charm/containers/<name>/pebble.socket. This works even against rocks with no shell (the shell lives in the charm container, not the rock) and stays entirely within your Juju authority — no kubectl or cluster-admin. It drives pebble via shimmer (a drop-in ops.pebble.Client over the Pebble CLI). When the Pebble socket is directly reachable (running inside the charm, or a local Pebble), SocketTransport uses the real ops.pebble.Client HTTP API instead.
  • Discovery — turns a unit reference into the right Pebble: confirms the unit, reads the charm's metadata.yaml for workload container names, and sanity-checks the container is alive. Everything uses your Juju model access — no kubectl / cluster-admin.
  • Shell — a small REPL: cd/pwd, path-aware tab completion, history, and a minimal command set. Pebble's own vocabulary (services, logs, plan, …) is first-class, not hidden behind a pebble prefix. For anything else, exec <cmd> runs a binary that's already in the container.

Scope

borescope is for Kubernetes charms (which run Pebble). Machine charms already have a real shell and are out of scope. It deliberately ships a minimal command set and grows on request — if a tool exists in the container, reach it with exec.

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

borescope-1.0.2.tar.gz (76.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

borescope-1.0.2-py3-none-any.whl (54.0 kB view details)

Uploaded Python 3

File details

Details for the file borescope-1.0.2.tar.gz.

File metadata

  • Download URL: borescope-1.0.2.tar.gz
  • Upload date:
  • Size: 76.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for borescope-1.0.2.tar.gz
Algorithm Hash digest
SHA256 2965e7684e23519e0c4df6e95611badb6b500b60caad338b7f65679338439f01
MD5 f0a9943637a0a9e5a919066b9abb0d92
BLAKE2b-256 e645a2b2e610b6e5b430a587f48d56352699e5d56b70861652cbf660368aa8da

See more details on using hashes here.

Provenance

The following attestation bundles were made for borescope-1.0.2.tar.gz:

Publisher: publish.yaml on tonyandrewmeyer/borescope

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file borescope-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: borescope-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 54.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for borescope-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 8eb116c0828b62f98f8e0522eb0cbb3a97999b2f02e742a144d8a560803b6324
MD5 7238caafa034f7b5c9720fa020a7d179
BLAKE2b-256 5dcfbe5ea82e4f8be3b6e10bb042922c73b0abf7cea3c7996902ad86f3c96308

See more details on using hashes here.

Provenance

The following attestation bundles were made for borescope-1.0.2-py3-none-any.whl:

Publisher: publish.yaml on tonyandrewmeyer/borescope

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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