exo: a process manager & log viewer for dev

Overview

exo: a process manager & log viewer for dev

exo- prefix – external; from outside.

The Exo GUI

Features

  • Procfile compatible process manager.
  • Terminal commands and browser-based-GUI for all functionality.
  • Multiplexed, colorizing log tailing. Toggle visibility of individual logs.
  • Dynamic process supervision: create, start, stop, restart, delete.

Coming Soon

  • Docker integration with docker-compose.yml compatibility.

Getting Started

Install exo:

curl -sL https://exo.deref.io/install | sh

If you prefer manual installation, see ./doc/install.md for details, including uninstall instructions.

Navigate to your code directory and then launch the exo gui:

exo gui

To use exo as a drop-in replacement for Foreman and similar Procfile runners, do this instead:

exo run ./path/to/Procfile

For more, checkout the exo guide or consult the builtin help by running exo help.


Telemetry

exo collects limited and anonymous telemetry data by default. This behavior can be disabled by adding the following setting to your exo config (located at ~/.exo/config.toml by default):

[telemetry]
disable: true
Issues
  • Stop button in the UI has different behavior than `Ctrl+C`-ing the same process

    Stop button in the UI has different behavior than `Ctrl+C`-ing the same process

    Not sure if this is intentional or not, but it leads to some annoying behavior when developing.

    When I run exo run tools/goreman/procfiles/Procfile.rexec with this procfile in our repo: https://github.com/buildbuddy-io/buildbuddy

    app: bazel run enterprise/server -- --config_file=enterprise/config/buildbuddy.local.yaml
    exec: bazel run enterprise/server/cmd/executor:executor -- --monitoring_port=9091 --executor.docker_socket=
    redis: redis-server
    

    And hit stop in the UI on exec, I get no logs about a shutdown. When I hit play again - the error message

    07:05:47  exec 2021/08/02 14:05:47.344 FTL listen tcp 0.0.0.0:9091: bind: address already in use
    

    This leads me to believe the server that bazel run spun up was never killed.

    When I run the same exec process on it's own in a terminal and hit Ctrl+C, I get the following logs:

    ^CCaught interrupt signal; shutting down...
    2021/08/02 14:13:04.832 INF Stopping queue processing, machine is shutting down. name=rN5IABEi
    2021/08/02 14:13:04.861 INF Graceful stop of executor succeeded.
    Server "prod-buildbuddy-executor" stopped.
    

    And don't get the port collision error when I start it again.

    My workaround for now is to hit Ctrl+C on exo run tools/goreman/procfiles/Procfile.rexec, which solves the issue - but means I have to restart all 3 processes.

    opened by siggisim 13
  • [BUG] Exo logging slow with lots of services

    [BUG] Exo logging slow with lots of services

    Describe the bug The following docker compose file takes a long time to start outputting logs in the terminal.

    services:
      t1:
        image: bash
        command: sh -c 'i=0; while true; do echo $((i++)); sleep 1; done'
      t2:
        image: bash
        command: sh -c 'i=0; while true; do echo $((i++)); sleep 1; done'
      t3:
        image: bash
        command: sh -c 'i=0; while true; do echo $((i++)); sleep 1; done'
      t4:
        image: bash
        command: sh -c 'i=0; while true; do echo $((i++)); sleep 1; done'
      t5:
        image: bash
        command: sh -c 'i=0; while true; do echo $((i++)); sleep 1; done'
      t6:
        image: bash
        command: sh -c 'i=0; while true; do echo $((i++)); sleep 1; done'
      t7:
        image: bash
        command: sh -c 'i=0; while true; do echo $((i++)); sleep 1; done'
      t8:
        image: bash
        command: sh -c 'i=0; while true; do echo $((i++)); sleep 1; done'
      t9:
        image: bash
        command: sh -c 'i=0; while true; do echo $((i++)); sleep 1; done'
    

    It takes about 30 seconds to start getting logs. From docker ps and from the output in the logs I can see that the containers themselves have been running for almost all of that time. The logs are then updated about once every 20 seconds.

    bug 
    opened by BenElgar 9
  • New config pages, manual theme setting & theme generation

    New config pages, manual theme setting & theme generation

    image

    This adds:

    • User preferences config with theme picker
    • Theme file generation from a minimal definition file, expanded into a CSS file which allows manual overrides and automatic theming
    • "New component" page with select for component types

    Also fixes #235

    This also begins to add some config page components for a new set of CRU~D~ pages and components for configuration, specifically aimed at:

    • Component type selection
    • Process creation and modification
    • Docker container creation and modification
    • Timer creation and modification

    Example

    image

    opened by jwmza 7
  • [BUG] Log prefix contrast too low

    [BUG] Log prefix contrast too low

    image

    Contrast of the prefix of the output of tailing logs is so low as to be illegible in dark terminals.

    bug 
    opened by BenElgar 7
  • [BUG] Timestamps are wrong (timezone/hours offset)

    [BUG] Timestamps are wrong (timezone/hours offset)

    Describe the bug In my actual local time, it is 12:38. The logs from tick correctly show this time, but the timestamps we create on the far left shows 4:38, an incorrect time.

    Expected behavior Our timestamps === actual user local time.

    Screenshots image

    System Info:

    • OS: Windows (WSL Ubuntu)
    • Component: GUI
    • Version: Dev (>2021.07.30)
    bug 
    opened by jwmza 7
  • Add license command & embed fonts

    Add license command & embed fonts

    @jwmza you can do your font embedding work off of this branch

    Fixes #145

    opened by brandonbloom 6
  • Misleading UI in the readme

    Misleading UI in the readme

    The advertised UI in the readme is not the same as the web app.

    bug documentation 
    opened by norman784 6
  • Improve filter input styling

    Improve filter input styling

    Adds similar styling to the log viewer filter input as the new process form text inputs have, as an improvement over the (inconsistent) browser defaults.

    image

    This uses Svelte's --style-props to allow overriding of the default 300px <Textbox /> input width without complicating the code for the actual components.


    • This also simplifies the styling for the dev footer (note that the footer is going away / being replaced somewhere else in ~1 day or so as we swap to a left-sidebar-only layout with no global footer or header)

    image

    opened by jwmza 6
  • Add docs website

    Add docs website

    This adds a Nextra + Typescript + Next.js react web app to display documentation and moves our docs pages from /doc/ to /docs/pages (mostly in order to appease Nextra).

    image


    You can develop & test this website like so:

    $ cd docs
    $ npm i
    $ npm run dev
    

    and opening localhost:3000


    Once this PR is merged, I'll deploy the site to Vercel and fix all the links + add a "Docs" link to exo.deref.io before making it available at another subdomain. I'm thinking exo-docs.deref.io @brandonbloom

    opened by jwmza 6
  • Amplitude analytics

    Amplitude analytics

    Hook up telemetry to send to Amplitude Analytics:

    • Maintain a device ID that is used as a unique identifier for all events from a particular installation.
      • Send this device ID in the upgrade requests so that the API that serves the install script can attribute the upgrade to that user.
    • Report very basic system information on startup (os, architecture, cpu count)
    • Update the default telemetry implementation to use Amplitude instead of the previous bespoke solution.
    opened by kendru 0
  • [FEATURE] Provide a way to create processes without starting them

    [FEATURE] Provide a way to create processes without starting them

    Is your feature request related to a problem? Please describe.

    I have 50ish processes and don't want to start all of them on my laptop right now.

    Describe the solution you'd like

    I'd like a way to define a process without starting it immediately, I don't care strongly about how usage looks.

    If I was designing the system, I'd probably completely separate editing the internal manifest from starting things. apply and new process would alter the internal manifest but you'd need to start to get something running.

    Describe alternatives you've considered

    There are lots of options. To preserve backward compatibility, you could add something like a --define-only or --dont-start options.

    You could also change the default behavior but add a --start option to do the define & start in one cli invocation.

    Brandon said that there are some ideas he's thinking about in #183 but that seems pretty vague at this point. If that's a long ways off, exo could be useful for largish projects soon by splitting defining processes from running them.

    feature request 
    opened by ryfow 2
  • Find a way to stop re-writing `on:click={() => router.push(...)}` so much

    Find a way to stop re-writing `on:click={() => router.push(...)}` so much

    We really need a Button component that supports href to specify this standard on-click behavior.

    Originally posted by @brandonbloom in https://github.com/deref/exo/pull/311#discussion_r705471494

    cleanup 
    opened by jwmza 0
  • [FEATURE] Delete Networks and Volumes from the GUI

    [FEATURE] Delete Networks and Volumes from the GUI

    Describe the solution you'd like I'd like to be able to delete Networks and Volumes from their tabs in the same way we can currently delete Processes and Containers from the main logs screen.

    Describe alternatives you've considered Alternatively, there could be one screen with a full list of all components with delete and edit options.

    feature request 
    opened by jwmza 1
  • [BUG] `exo run` stop-on-exit behavior fights with GUI

    [BUG] `exo run` stop-on-exit behavior fights with GUI

    To Reproduce

    1. use `exo run
    2. launch the gui
    3. click to stop a process
    4. you'll see a flash of an "internal server error"
    bug 
    opened by brandonbloom 0
  • [FEATURE] auto-apply

    [FEATURE] auto-apply

    Sometimes, I edit a Procfile or a docker-compose.yaml file, and forget to run exo apply. If I'm using exo run, the apply is automatic, but we should watch the current manifest and auto-apply, or at least warn when current spec != manifest.

    feature request 
    opened by brandonbloom 0
  • Add manifest support

    Add manifest support

    The idea here is to extract the manifest conversion from the manifest loading. The manifest will first be converted, the converted version saved and then the converted one actually applied.

    The major thing missing from this right now is the writing back of manifests when things are changed in the UI but the infrastructure is there to preserve comments and formatting.

    procfile

    t0: /home/ben/Programming/exo/bin/tick
    
    exo: "0.1"
    components:
      - name: t0
        type: process
        spec:
            program: /home/ben/Programming/exo/bin/tick
            environment:
                PORT: "5000"
    

    docker-compose

    services:
      t0:
        image: bash
        command: "sleep infinity"
        env_file: my-env
    
    exo: "0.1"
    components:
      - name: default
        type: network
        spec:
            driver: bridge
            name: tmpMQvlHcwsZ4_default
      - name: t0
        type: container
        spec:
            command: sleep infinity
            container_name: tmpMQvlHcwsZ4_t0_1
            env_file: my-env
            image: bash
            labels:
                com.docker.compose.project: tmpMQvlHcwsZ4
                com.docker.compose.service: t0
            networks:
                tmpMQvlHcwsZ4_default:
                    network: tmpMQvlHcwsZ4_default
        depends_on:
          - default
    
    opened by BenElgar 1
  • [FEATURE] package for popular package managers

    [FEATURE] package for popular package managers

    Package Managers

    • [ ] Mac: Homebrew
    • [ ] Nix?
    • [ ] Something on Windows?
    • [ ] Apt on Linux?
    • [ ] What else?

    Open Questions

    • Which package managers? Need to prioritize.
    • How will this affect our velocity?
    • What versions do we support? For how long?
    • How does licensing affect packaging?
    feature request 
    opened by brandonbloom 1
  • [BUG] exo fails if docker resources don't exist

    [BUG] exo fails if docker resources don't exist

    If, for example, exo has created a docker network that is then removed by something other than exo, exo will fail to recreate it when needed.

    Assigning to myself to flesh out the issue better.

    bug needs triage 
    opened by BenElgar 0
  • [FEATURE] release notes should include changelog details

    [FEATURE] release notes should include changelog details

    would be nice if our release script copied the most recent changelog entries in to the release notes

    feature request 
    opened by brandonbloom 0
Releases(v2021.09.14)
Parse awesome-go README file and generate a new README file with repo info.

Awesome Go Extra All data are from awesome-go and GitHub API. Audio and Music Libraries for manipulating audio. Name Description Star Open Issues Crea

Wendell Sun 18 Sep 25, 2021
Structured, pluggable logging for Go.

Logrus Logrus is a structured logger for Go (golang), completely API compatible with the standard library logger. Logrus is in maintenance-mode. We wi

Simon Eskildsen 18.7k Sep 23, 2021
Logrus is a structured, pluggable logging for Go.

Logrus is a structured logger for Go (golang), completely API compatible with the standard library logger.

Simon Eskildsen 274 May 25, 2021
Parametrized JSON logging library in Golang which lets you obfuscate sensitive data and marshal any kind of content.

Noodlog Summary Noodlog is a Golang JSON parametrized and highly configurable logging library. It allows you to: print go structs as JSON messages; pr

Gyoza Tech 31 Sep 23, 2021
Zero Allocation JSON Logger

Zero Allocation JSON Logger The zerolog package provides a fast and simple logger dedicated to JSON output. Zerolog's API is designed to provide both

Olivier Poitrey 5.3k Sep 21, 2021
Simple, configurable and scalable Structured Logging for Go.

log Log is a simple, highly configurable, Structured Logging library Why another logging library? There's allot of great stuff out there, but also tho

Go Playgound 275 May 6, 2021
Gowl is a process management and process monitoring tool at once. An infinite worker pool gives you the ability to control the pool and processes and monitor their status.

Gowl is a process management and process monitoring tool at once. An infinite worker pool gives you the ability to control the pool and processes and monitor their status.

Hamed Yousefi 11 Sep 5, 2021
simple concurrent logger

XMUS-LOGGER pure golang logger compatible with golang io standards. USAGE : logOptions := logger.LoggerOptions{ LogLevel: 6, // read more about lo

amupxm [amir hossein mokarrami far] 5 Sep 19, 2021
A logger, for Go

Go-Log A logger, for Go! It's sort of log and code.google.com/p/log4go compatible, so in most cases can be used without any code changes. Breaking cha

Ian Kent 37 Feb 21, 2021
A Go (golang) package providing high-performance asynchronous logging, message filtering by severity and category, and multiple message targets.

ozzo-log Other languages 简体中文 Русский Description ozzo-log is a Go package providing enhanced logging support for Go programs. It has the following fe

Ozzo Framework 114 May 17, 2021
Simple and configurable Logging in Go, with level, formatters and writers

go-log Logging package similar to log4j for the Golang. Support dynamic log level Support customized formatter TextFormatter JSONFormatter Support mul

Guoqiang Chen 11 Feb 20, 2021
A minimal and extensible structured logger

⚠️ PRE-RELEASE ⚠️ DO NOT IMPORT THIS MODULE YOUR PROJECT WILL BREAK package log package log provides a minimal interface for structured logging in ser

Go kit 55 Sep 16, 2021
Port of perl5 File::RotateLogs to Go

file-rotatelogs Provide an io.Writer that periodically rotates log files from within the application. Port of File::RotateLogs from Perl to Go. SYNOPS

null 738 Sep 16, 2021
lumberjack is a log rolling package for Go

lumberjack Lumberjack is a Go package for writing logs to rolling files. Package lumberjack provides a rolling logger. Note that this is v2.0 of lumbe

Nate Finch 2.8k Sep 25, 2021
Structured log interface

Structured log interface Package log provides the separation of the logging interface from its implementation and decouples the logger backend from yo

teris.io 24 Jan 3, 2021
Simple logger for Go programs. Allows custom formats for messages.

go-logger A simple go logger for easy logging in your programs. Allows setting custom format for messages. Preview Install go get github.com/apsdehal/

Amanpreet Singh 269 Aug 30, 2021
A pure Go contextual logging library with "batteries included"

Cue Overview Cue implements contextual logging with "batteries included". It has thorough test coverage and supports logging to stdout/stderr, file, s

Bob Ziuchkovski 26 Sep 16, 2019
Logur is an opinionated collection of logging best practices

Logur is an opinionated collection of logging best practices. Table of Contents Preface Features Installation Usage FAQ Why not just X logger? Why not

Logur 139 Sep 20, 2021
Minimalistic logging library for Go.

logger Minimalistic logging library for Go. Blog Post Features: Advanced output filters (package and/or level) Attributes Timers for measuring perform

Azer Koçulu 148 Mar 29, 2021