Sloop - Kubernetes History Visualization

Sloop - Kubernetes History Visualization

Build Status Go Report Card Docker Pulls


Sloop monitors Kubernetes, recording histories of events and resource state changes and providing visualizations to aid in debugging past events.

Key features:

  1. Allows you to find and inspect resources that no longer exist (example: discover what host the pod from the previous deployment was using).
  2. Provides timeline displays that show rollouts of related resources in updates to Deployments, ReplicaSets, and StatefulSets.
  3. Helps debug transient and intermittent errors.
  4. Allows you to see changes over time in a Kubernetes application.
  5. Is a self-contained service with no dependencies on distributed storage.

Screenshots

Screenshot1

Architecture Overview

Architecture

Install

Sloop can be installed using any of these options:

Helm Chart

Users can install sloop by using helm chart now, for instructions refer helm readme

Precompiled Binaries

Build from Source

Building Sloop from source needs a working Go environment with version 1.13 or greater installed.

Clone the sloop repository and build using make:

mkdir -p $GOPATH/src/github.com/salesforce
cd $GOPATH/src/github.com/salesforce
git clone https://github.com/salesforce/sloop.git
cd sloop
go env -w GO111MODULE=auto
make
$GOPATH/bin/sloop

When complete, you should have a running Sloop version accessing the current context from your kubeConfig. Just point your browser at http://localhost:8080/

Other makefile targets:

  • docker: Builds a Docker image.
  • cover: Runs unit tests with code coverage.
  • generate: Updates genny templates for typed table classes.
  • protobuf: Generates protobuf code-gen.

Local Docker Run

To run from Docker you need to host mount your kubeconfig:

make docker-snapshot
docker run --rm -it -p 8080:8080 -v ~/.kube/:/kube/ -e KUBECONFIG=/kube/config sloop

In this mode, data is written to a memory-backed volume and is discarded after each run. To preserve the data, you can host-mount /data with something like -v /data/:/some_path_on_host/

Updating webfiles folder

To reflect any changes to webserver/webfiles, run the following command on terminal while within the webserver directory before submitting a pr:

go-bindata -pkg webserver -o bindata.go webfiles/

This will update the bindata folder with your changes to any html, css or javascript files within the directory.

Local Docker Run and connecting to EKS

This is very similar to above but abstracts running docker with AWS credentials for connecting to EKS

make docker
export AWS_ACCESS_KEY_ID=<access_key_id> AWS_SECRET_ACCESS_KEY=<secret_access_key> AWS_SESSION_TOKEN=<session_token>
./providers/aws/sloop_to_eks.sh <cluster name>

Data retention policy stated above still applies in this case.

Backup & Restore

This is an advanced feature. Use with caution.

To download a backup of the database, navigate to http://localhost:8080/data/backup

To restore from a backup, start sloop with the -restore-database-file flag set to the backup file downloaded in the previous step. When restoring, you may also wish to set the -disable-kube-watch=true flag to stop new writes from occurring and/or the -context flag to restore the database into a different context.

Memory Consumption

Sloop's memory usage can be managed by tweaking several options:

  • badger-use-lsm-only-options If this flag is set to true, values would be collocated with the LSM tree, with value log largely acting as a write-ahead log only. Recommended value for memory constrained environments: false
  • badger-keep-l0-in-memory When this flag is set to true, Level 0 tables are kept in memory. This leads to better performance in writes as well as compactions. Recommended value for memory constrained environments: false
  • badger-sync-writes When SyncWrites is true all writes are synced to disk. Setting this to false would achieve better performance, but may cause data loss in case of crash. Recommended value for memory constrained environments: false
  • badger-vlog-fileIO-mapping TableLoadingMode indicates which file loading mode should be used for the LSM tree data files. Setting to true would not load the value in memory map. Recommended value for memory constrained environments: true

Apart from these flags some other values can be tweaked to fit in the memory constraints. Following are some examples of setups.

  • Memory consumption max limit: 1GB
               // 0.5<<20 (524288 bytes = 0.5 Mb)               
               "badger-max-table-size=524288",
               "badger-number-of-compactors=1",
               "badger-number-of-level-zero-tables=1",
               "badger-number-of-zero-tables-stall=2",
  • Memory consumption max limit: 2GB
               // 16<<20 (16777216 bytes = 16 Mb)              
               "badger-max-table-size=16777216",
               "badger-number-of-compactors=1",
               "badger-number-of-level-zero-tables=1",
               "badger-number-of-zero-tables-stall=2",
  • Memory consumption max limit: 5GB
               // 32<<20 (33554432 bytes = 32 Mb)             
               "badger-max-table-size=33554432",
               "badger-number-of-compactors=1",
               "badger-number-of-level-zero-tables=2",
               "badger-number-of-zero-tables-stall=3",

Apart from the above settings, max-disk-mb and max-look-back can be tweaked according to input data and memory constraints.

Contributing

Refer to CONTRIBUTING.md

License

BSD 3-Clause

Owner
Salesforce
A variety of vendor agnostic projects which power Salesforce
Salesforce
Comments
  • Excessive memory consumption?

    Excessive memory consumption?

    We are currently experimenting to use sloop.

    We find it very useful but we found out that it was very greedy regarding memory. After less than a full day, it is currently using 5Gb of memory :(

    Is it the normal behaviour?

    The last 3 hours sloop-last-3hours-2020 04 08-16_19_41

    The last 24 hours sloop-last-24hours-2020 04 08-16_20_06

    Here is our current configuration (no memory limits on purpose to see what's needed without being OOM killed)

    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: sloop
      labels:
        app.kubernetes.io/name: sloop
    spec:
      serviceName: sloop
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: sloop
      template:
        metadata:
          labels:
            app.kubernetes.io/name: sloop
        spec:
          containers:
            - args:
                - --config=/sloop-config/sloop.json
              command:
                - /sloop
              image: FIXME/sloop
              name: sloop
              ports:
                - containerPort: 8080
                  protocol: TCP
              livenessProbe:
                httpGet:
                  path: /healthz
                  port: 8080
                initialDelaySeconds: 30
                periodSeconds: 10
                timeoutSeconds: 5
                successThreshold: 1
                failureThreshold: 3
              readinessProbe:
                httpGet:
                  path: /healthz
                  port: 8080
                initialDelaySeconds: 5
                periodSeconds: 10
                timeoutSeconds: 5
                successThreshold: 1
                failureThreshold: 3
              resources:
                limits: {}
                requests:
                  memory: 1.5Gi
                  cpu: 50m
              volumeMounts:
                - mountPath: /data
                  name: sloop-data
                - mountPath: /sloop-config
                  name: sloop-config
                - mountPath: /tmp
                  name: sloop-tmp
              securityContext:
                allowPrivilegeEscalation: false
                privileged: false
                runAsNonRoot: true
                runAsUser: 100
                runAsGroup: 1000
                readOnlyRootFilesystem: true
          securityContext:
            fsGroup: 1000
          volumes:
            - name: sloop-config
              configMap:
                name: sloop-config
            - name: sloop-tmp
              emptyDir:
                sizeLimit: 100Mi
          serviceAccountName: sloop
          terminationGracePeriodSeconds: 10
      volumeClaimTemplates:
        - metadata:
            name: sloop-data
          spec:
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 10Gi
    
  • Remove selectedEndTime.max

    Remove selectedEndTime.max

    As submitted in https://github.com/salesforce/sloop/issues/194 and https://github.com/salesforce/sloop/issues/167, users are running into issues with the max end time. I ran into this too and it makes the app unusable. I looked into this, and there are three issues:

    • iso is adjusted from utcNow, but then calling toISOString(), so essentially double offset
    • the elem.max is only set on $(document).ready, which means if a user presses the "Now" button, it ends up after the max
    • elem.value is set twice

    I started to fix these, but stepping back, I don't understand why we need a max at all. It really should be just "now" when the server accepts the request, not when the page first (or even subsequently) loaded on the client side. As such, this drops the setting of elem.max. It also cleaned up the unused vars and the double setting of elem.value.

    Fixes https://github.com/salesforce/sloop/issues/167 Fixes https://github.com/salesforce/sloop/issues/194 cc: @mengyaoyang11

  • Data race in refreshStats

    Data race in refreshStats

    reproduced with go build -race on latest master 675b8ad:

    ==================
    WARNING: DATA RACE
    Write at 0x00c006b6e138 by goroutine 45:
      github.com/salesforce/sloop/pkg/sloop/storemanager.(*StoreManager).refreshStats()
          /data00/home/chankyin/go/src/github.com/salesforce/sloop/pkg/sloop/storemanager/storemanager.go:173 +0x135
      github.com/salesforce/sloop/pkg/sloop/storemanager.(*StoreManager).vlogGcLoop()
          /data00/home/chankyin/go/src/github.com/salesforce/sloop/pkg/sloop/storemanager/storemanager.go:138 +0x22b
      github.com/salesforce/sloop/pkg/sloop/storemanager.(*StoreManager).Start·dwrap·3()
          /data00/home/chankyin/go/src/github.com/salesforce/sloop/pkg/sloop/storemanager/storemanager.go:88 +0x39
    
    Previous write at 0x00c006b6e138 by goroutine 240:
      github.com/salesforce/sloop/pkg/sloop/storemanager.(*StoreManager).refreshStats()
          /data00/home/chankyin/go/src/github.com/salesforce/sloop/pkg/sloop/storemanager/storemanager.go:173 +0x135
      github.com/salesforce/sloop/pkg/sloop/storemanager.(*StoreManager).gcLoop()
          /data00/home/chankyin/go/src/github.com/salesforce/sloop/pkg/sloop/storemanager/storemanager.go:101 +0x259
      github.com/salesforce/sloop/pkg/sloop/storemanager.(*StoreManager).Start·dwrap·2()
          /data00/home/chankyin/go/src/github.com/salesforce/sloop/pkg/sloop/storemanager/storemanager.go:87 +0x39
    
  • Home button in debug menu

    Home button in debug menu

    Home button on the debug menu does not return to home page.

    Fix: Change the way the href in the home button is generated. Made changes in all references to the home button in other pages.

  • Make the Helm chart compatible with new Kubernetes API

    Make the Helm chart compatible with new Kubernetes API

    In the issue #195 I mentioned that the Ingress manifest within the Helm chart has to be updated to be compatible with a modern Kubernetes API.

    This PR does that, including some other fixes:

    • Use new RBAC API version
    • Added ingressClassName option to the chart
  • Failed to list resources on startup in k8s 1.16+

    Failed to list resources on startup in k8s 1.16+

    When connecting to k8s cluster with version 1.16 or higher receiving a lot of errors like this: E0415 12:30:41.601909 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.DaemonSet: the server could not find the requested resource E0415 12:30:41.672392 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.ReplicaSet: the server could not find the requested resource E0415 12:30:42.712250 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.DaemonSet: the server could not find the requested resource E0415 12:30:42.795160 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.ReplicaSet: the server could not find the requested resource E0415 12:30:43.806459 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.DaemonSet: the server could not find the requested resource E0415 12:30:43.890617 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.ReplicaSet: the server could not find the requested resource E0415 12:30:45.067983 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.DaemonSet: the server could not find the requested resource E0415 12:30:45.252900 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.ReplicaSet: the server could not find the requested resource E0415 12:30:46.359063 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.DaemonSet: the server could not find the requested resource E0415 12:30:46.368595 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.ReplicaSet: the server could not find the requested resource E0415 12:30:47.640136 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.DaemonSet: the server could not find the requested resource E0415 12:30:47.668593 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1beta1.ReplicaSet: the server could not find the requested resource

    If I connect to k8s 1.15 there is no such errors. I think it`s related to this https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/

    I tried to make changes to api version kubewatcher.go:

    i.informerFactory.Apps().V1().DaemonSets().Informer().AddEventHandler(i.getEventHandlerForResource("DaemonSet")) i.informerFactory.Apps().V1().ReplicaSets().Informer().AddEventHandler(i.getEventHandlerForResource("ReplicaSet"))

    but still, have these errors. I can't find any use of beta APIs in other go files, but I`m not a go programmer.

    Any help?

  • Badger Compaction Issue

    Badger Compaction Issue

    Hi, there's an issue with Sloop that occurs when you consume all of maxDiskDb and a compaction runs, the sloop graphs disappear (and subsequent writes aren't made to the DB).

    I'm able to consistently reproduce this by installing the latest helm chart without any overrides, except adding --max-disk-mb=1 to the command line.

    It seems to occur after these events:

    I1211 01:51:02.648860       1 storemanager.go:171] Start cleaning up because current file size: 14073983 exceeds file size: 1048576
    badger 2019/12/11 01:51:02 INFO: Writes flushed. Stopping compactions now...
    badger 2019/12/11 01:51:02 DEBUG: Flushing memtable
    badger 2019/12/11 01:51:02 DEBUG: Storing value log head: {Fid:0 Len:32 Offset:13236655}
    badger 2019/12/11 01:51:02 INFO: Got compaction priority: {level:0 score:1.74 dropPrefix:[47 119 97 116 99 104 47 48 48 49 53 55 54 48 50 54 48 48 48]}
    badger 2019/12/11 01:51:02 INFO: Running for level: 0
    badger 2019/12/11 01:51:02 DEBUG: LOG Compact. Added 212 keys. Skipped 114 keys. Iteration took: 466.315µs
    badger 2019/12/11 01:51:02 DEBUG: Discard stats: map[0:205537]
    badger 2019/12/11 01:51:02 INFO: LOG Compact 0->1, del 2 tables, add 1 tables, took 11.140577ms
    badger 2019/12/11 01:51:02 INFO: Compaction for level: 0 DONE
    badger 2019/12/11 01:51:02 DEBUG: LOG Compact. Added 205 keys. Skipped 7 keys. Iteration took: 444.281µs
    badger 2019/12/11 01:51:02 DEBUG: Discard stats: map[0:7658]
    badger 2019/12/11 01:51:02 INFO: LOG Compact 1->1, del 1 tables, add 1 tables, took 10.030778ms
    badger 2019/12/11 01:51:02 INFO: DropPrefix done
    badger 2019/12/11 01:51:02 INFO: Resuming writes
    badger 2019/12/11 01:51:02 INFO: Writes flushed. Stopping compactions now...
    badger 2019/12/11 01:51:02 DEBUG: LOG Compact. Added 201 keys. Skipped 4 keys. Iteration took: 261.251µs
    badger 2019/12/11 01:51:02 DEBUG: Discard stats: map[0:582]
    badger 2019/12/11 01:51:02 INFO: LOG Compact 1->1, del 1 tables, add 1 tables, took 8.278415ms
    badger 2019/12/11 01:51:02 INFO: DropPrefix done
    badger 2019/12/11 01:51:02 INFO: Resuming writes
    badger 2019/12/11 01:51:02 INFO: Writes flushed. Stopping compactions now...
    badger 2019/12/11 01:51:02 DEBUG: LOG Compact. Added 201 keys. Skipped 0 keys. Iteration took: 277.819µs
    badger 2019/12/11 01:51:02 DEBUG: Discard stats: map[]
    badger 2019/12/11 01:51:02 INFO: LOG Compact 1->1, del 1 tables, add 1 tables, took 12.260061ms
    badger 2019/12/11 01:51:02 INFO: DropPrefix done
    badger 2019/12/11 01:51:02 INFO: Resuming writes
    

    image

  • Changed payload ticks to be more visible

    Changed payload ticks to be more visible

    Payload changes were displayed by red and black ticks that were not that visible and had no explanation on them. Fix: Changed the black ticks to white ticks to increase visibility. Added a hover over so that there is information on what the ticks represent. Added a toggle to turn off payload change information.

    Before: Screen Shot 2021-09-28 at 4 37 13 PM

    After: Screen Shot 2021-09-28 at 4 37 55 PM

  • Error in initializing K8s client: no Auth Provider found for name

    Error in initializing K8s client: no Auth Provider found for name "azure"

    Hi,

    I am getting the below error when trying to run sloop in a docker container

    kubeclient.go:42] Creating k8sclient with user-defined config masterURL=, kubeContext=*****.
    mysloop_1  | E0525 17:05:16.909310       1 kubeclient.go:53] Cannot Initialize Kubernetes Client API: no Auth Provider found for name "azure"
    mysloop_1  | I0525 17:05:16.910185       1 store.go:112] Closing store
    mysloop_1  | badger 2021/05/25 17:05:16 INFO: Got compaction priority: {level:0 score:1.73 dropPrefix:[]}
    mysloop_1  | I0525 17:05:16.918293       1 store.go:114] Finished closing store
    mysloop_1  | E0525 17:05:16.934304       1 main.go:31] Main exited with error: failed to create kubernetes client: no Auth Provider found for name "azure"
    
    

    Looks like https://github.com/salesforce/sloop/blob/master/pkg/sloop/ingress/kubeclient.go does not import the azure auth plugin as mentioned in https://github.com/liggitt/kubernetes/blob/master/staging/src/k8s.io/client-go/examples/README.md#auth-plugins

    import _ "k8s.io/client-go/plugin/pkg/client/auth/azure"

  • Fix end time

    Fix end time

    With current master the "Details" view on selecting a resource was broken, with errors in the server log about missing "endtime" param ... as the golang code is using end_time in https://github.com/salesforce/sloop/blob/14ae23c068c64c25ccaa586d4e6bfff728bda846/pkg/sloop/webserver/resourcehandler.go#L86-L90

    Hope you don't mind @mengyaoyang11 @sana-jawad but I'm reverting #151 to keep the "xxx_time" variables all in the same style with each other, and updated what I hope is one bit of JS code that uses it.

    Also updated the Readme to include a better form of go-bindata command which is needed to keep the package name webserver without manual fixup, at least with the v3.1.2 I have...

  • Add helm options for config, pullPolicy and apiGroups

    Add helm options for config, pullPolicy and apiGroups

    I had to make some changes to the helm chart to get it usable in our cluster, including control over the bits needed from the external values file.

    Note I had to define a non-empty displayContext also, to avoid getting stuck in a redirect loop, not sure if this a bug or not.

    Sorry my auto-formatting editor has put in a bunch of whitespace fixups, hope you don't mind them included...

  • Update Release Process

    Update Release Process

    As part of a migration to GHA from Travis and GitHub packages for artifacts there are some remaining parts to complete:

    On PR raise:

    • [x] Run lint, format, test, build - #241
    • [ ] Enforce all above

    On merge PR to master:

    • [ ] Build container image and tag with latest for ease of local dev

    On git tag creation:

    • [ ] Create release
    • [ ] Attach release notes / changelog
    • [ ] Build binaries and attach to release
    • [ ] Build container (already getting done) but additionally tag with git tag
    • [ ] Build helm chart tar.gz and attach to release
  • Helm Chart still on 0.1.0 version and image tag latest

    Helm Chart still on 0.1.0 version and image tag latest

    Chart still on the same version while new releases seems to be published. Also image tag in values is latest please pin it to the proper version image

  • while running sloop application getting violation of Content Security policy violation

    while running sloop application getting violation of Content Security policy violation

    installed application on namespace sloop service type changed to Loadbalancer . and then ExternalIP updated with DNS name while accessing Sloop dashboard with DNS name following error/violation observed in webpage console. image

    please help me in rectifying these error

  • Im unable to get logs

    Im unable to get logs

    sloop log

    i followed these step..

    kubectl create ns sloop helm install sloop -n sloop ./sloop kubectl get pods (pod was running)

    kubectl port-forward -n sloop service/sloop 8080:80

    then went to browser http://localhost:8080/ to view the dashboard.

    in dashboard im unable to find logs . please help me

    log in pod: Im getting this error in "sloop" pod E0906 06:02:11.651577 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *unstructured.Unstructured: volumesnapshotclasses.snapshot.storage.k8s.io is forbidden: User "system:serviceaccount:sloop:sloop" cannot list resource "volumesnapshotclasses" in API group "snapshot.storage.k8s.io" at the cluster scope

  • Failed to create kubernetes client: invalid configurations: no configuration has been provided

    Failed to create kubernetes client: invalid configurations: no configuration has been provided

    For clusters hosted on aws , for which we do not want to give access to the kube config file in the root directory, we can get the configurations from "/var/run/secrets/kubernetes.io/serviceaccount/token" . We can thus use a flag which allows us to turn off privileged access and thereby gets cluster config from rest.InClusterConfig() in Clientcmd.BuildConfigFromFlags

    Here is the link to the PR : https://github.com/salesforce/sloop/pull/223

gosivy - Another visualization tool for Go process metrics
gosivy - Another visualization tool for Go process metrics

gosivy Another visualization tool for Go process metrics. Gosivy tracks Go process's metrics and plot their evolution over time right into your termin

Nov 27, 2022
🚀Statsview is a real-time Golang runtime stats visualization profiler
🚀Statsview is a real-time Golang runtime stats visualization profiler

Statsview is a real-time Golang runtime stats visualization profiler. It is built top on another open-source project, go-echarts, which helps statsview to show its graphs on the browser.

Dec 29, 2022
Interactive Terraform visualization. State and configuration explorer.
Interactive Terraform visualization. State and configuration explorer.

Rover - Terraform Visualizer Rover is a Terraform visualizer. In order to do this, Rover: generates a plan file and parses the configuration in the ro

Jan 9, 2023
entviz is an ent extension that provides visualization of the schema graph
entviz is an ent extension that provides visualization of the schema graph

entviz entviz is an ent extension that creates visual graph (html file) of your ent's schema. install go get github.com/hedwigz/entviz add this exten

Dec 9, 2022
Interactive dependency graph visualization tool for golang
Interactive dependency graph visualization tool for golang

Interactive dependency graph visualization tool for golang using the awesome cytoscape graph visualizer.

Sep 1, 2022
Data visualization with chart, Create CSV file, Read Write CSV file

Data visualization with chart, Create CSV file, Read Write CSV file, Read from json file and many more in single project ......

Jan 13, 2022
Good enough Kubernetes namespace visualization tool
Good enough Kubernetes namespace visualization tool

Kubesurveyor Good enough Kubernetes namespace visualization tool. No provisioning to a cluster required, only Kubernetes API is scrapped. Installation

Dec 7, 2022
Pure Go line editor with history, inspired by linenoise

Liner Liner is a command line editor with history. It was inspired by linenoise; everything Unix-like is a VT100 (or is trying very hard to be). If yo

Jan 3, 2023
Decrypt passwords/cookies/history/bookmarks from the browser.
Decrypt passwords/cookies/history/bookmarks from the browser.

hack-browser-data is an open-source tool that could help you decrypt data ( passwords|bookmarks|cookies|history ) from the browser. It supports the most popular browsers on the market and runs on Windows, macOS and Linux.

Jan 9, 2023
Pi-hole data right from your terminal. Live updating view, query history extraction and more!
Pi-hole data right from your terminal. Live updating view, query history extraction and more!

Pi-CLI Pi-CLI is a command line program used to view data from a Pi-Hole instance directly in your terminal.

Dec 12, 2022
Create changelogs for Helm Charts, based on git history

helm-changelog Create changelogs for Helm Charts, based on git history. The application depends on the assumption that the helm chart is released on t

Nov 27, 2022
Integrated console application library, using Go structs as commands, with menus, completions, hints, history, Vim mode, $EDITOR usage, and more ...
Integrated console application library, using Go structs as commands, with menus, completions, hints, history, Vim mode, $EDITOR usage, and more ...

Gonsole - Integrated Console Application library This package rests on a readline console library, (giving advanced completion, hint, input and histor

Nov 20, 2022
A sample FaaS function that gets a stock quote and 30 day history by symbol and returns a HTML page with a generates SVG sparkline.

faas stonks This uses serverless technology to get a stock quote and 30 day sparkline from Yahoo Finance. Deployment Nimbella account Namespace with o

Sep 23, 2021
Shows your recent browser history in tree style. 树状展示浏览器历史 (For Edge / Chromium / Chrome)
Shows your recent browser history in tree style. 树状展示浏览器历史  (For Edge / Chromium / Chrome)

Tree Style Histyle This extension shows your recent browser history in tree style. When you browser pages from internet, you always jump from one page

Jan 3, 2023
Create new commands from your shell history or terminal.

overdub Create new commands from your shell history or terminal. TODO list for initial release Filter out unlikely commands (e.g. package managers) fr

Aug 9, 2022
🏗️ Fetch a specific commit without any history (shallow depth w/o cloning)

shallow-fetch-sha ??️ For a given git repository and commit, fetch and checkout just that commit without any history. This can be extremely useful in

Nov 27, 2021
Check the report history of any IP address to see if anyone else has reported malicious activities using API

abuseip Check the report history of any IP address to see if anyone else has reported malicious activities using API by abuseipdb.com. Installation $

Nov 13, 2021
Pure Go command line prompt with history, kill-ring, and tab completion

Prompt Prompt is a command line prompt editor with history, kill-ring, and tab completion. It was inspired by linenoise and derivatives which eschew u

Nov 20, 2021
Download your Fitbit weight history and connect to InfluxDB and Grafana

WemonFit Weight monitoring for Fitbit, using InfluxDB and Grafana Generating a new certificate openssl req -new -newkey rsa:2048 -nodes -keyout lo

Oct 22, 2022
A simple CLI tool that outputs the history of connections to Amazon EC2 instances using AWS Session Manager.

ssmh This is a simple CLI tool that outputs the history of connections to Amazon EC2 instances using AWS Session Manager. Installation brew install mi

Dec 10, 2021