{"id":19268558,"url":"https://github.com/moolen/logistis","last_synced_at":"2025-08-03T14:11:14.141Z","repository":{"id":60001542,"uuid":"523463565","full_name":"moolen/logistis","owner":"moolen","description":"User Interaction Tracking for Kubernetes","archived":false,"fork":false,"pushed_at":"2022-09-30T18:12:31.000Z","size":98,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-05T12:41:53.554Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moolen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-08-10T18:58:28.000Z","updated_at":"2022-09-14T18:51:32.000Z","dependencies_parsed_at":"2022-09-25T14:52:11.803Z","dependency_job_id":null,"html_url":"https://github.com/moolen/logistis","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moolen%2Flogistis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moolen%2Flogistis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moolen%2Flogistis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moolen%2Flogistis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moolen","download_url":"https://codeload.github.com/moolen/logistis/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240371742,"owners_count":19790888,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T20:16:41.774Z","updated_at":"2025-02-23T19:46:25.115Z","avatar_url":"https://github.com/moolen.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📖 Logistis\n\nUser Interaction Tracking for Kubernetes.\n\nLogistis is an application which observes **user interaction** with a Kubernetes cluster. Think `Google Analytics for Kubernetes`.\nIt tracks CRUD operations via ValidatingWebhook and stores it in its own local database.\nThe tracking events can be fetched as `json` or shown as `diff`.\n\nIt allows you to:\n* track who made a change in which namespace to which resource\n* track what changes have been made and when\n* get an overview of recent changes in a cluster\n\n\u003e Yes, everyone does gitops. But people still need to operate their stuff.\n\n#### TODO/Roadmap\n- [x] `kubectl blame` plugin to inspect changes\n  - [x] overview on a cluster-global level: latest changes by namespace\n  - [x] latest changes per-namespace\n- [x] make event limit configurable (currently max 100 events per resource)\n- [x] add predicate functions to decide whether or not to capture a event\n- [ ] distributed event storage 🤷\n\n### Quickstart\n\n```\n$ make deploy\n# ...make changes to a pod or deployment\n```\n\n# blame with `patch`\n\n```\nkubectl blame deployment\n+--------------------------+-----------+------------------+----------------------+---------------------------------------------------------------------+\n| KEY                      | OPERATION | USER             | TIME                 | PATCH                                                               |\n+--------------------------+-----------+------------------+----------------------+---------------------------------------------------------------------+\n| default/Deployment/nginx | UPDATE    | kubernetes-admin | 2022-08-13T22:08:53Z | replace /metadata/labels/app                                        |\n|                          |           |                  |                      | remove /metadata/managedFields/0/fieldsV1/f:metadata/f:labels/.     |\n|                          |           |                  |                      | remove /metadata/managedFields/0/fieldsV1/f:metadata/f:labels/f:app |\n|                          |           |                  |                      | add /metadata/managedFields/2                                       |\n|                          |           |                  |                      |                                                                     |\n+--------------------------+-----------+------------------+----------------------+---------------------------------------------------------------------+\n| default/Deployment/nginx | CREATE    | kubernetes-admin | 2022-08-13T22:08:45Z | add                                                                 |\n|                          |           |                  |                      |                                                                     |\n+--------------------------+-----------+------------------+----------------------+---------------------------------------------------------------------+\n```\n\n# blame with `diff`\n\n```\nkubectl blame deployment -f diff\n+---------------------------------------------------------------------------------+\n| 35m | default/deployment/nginx | UPDATE | kubernetes-admin                      |\n| groups:                                                                         |\n| - system:masters                                                                |\n| - system:authenticated                                                          |\n|                                                                                 |\n+---------------------------------------------------------------------------------+\n|        \"deployment.kubernetes.io/revision\": \"1\",                                |\n|        \"kubectl.kubernetes.io/last-applied-configuration\": \"{\"apiVersion\":\"apps |\n| \"                                                                               |\n|      },                                                                         |\n|      \"creationTimestamp\": \"2022-09-15T20:09:52Z\",                               |\n| -    \"generation\": 5,                                                           |\n| +    \"generation\": 6,                                                           |\n|      \"managedFields\": [                                                         |\n|        0: {                                                                     |\n|          \"apiVersion\": \"apps/v1\",                                               |\n|          \"fieldsType\": \"FieldsV1\",                                              |\n|          \"fieldsV1\": {                                                          |\n| [...]                                                                           |\n|              }                                                                  |\n|            },                                                                   |\n|            \"f:spec\": {                                                          |\n|              \"f:progressDeadlineSeconds\": {                                     |\n|              },                                                                 |\n| -            \"f:replicas\": {                                                    |\n| -            },                                                                 |\n|              \"f:revisionHistoryLimit\": {                                        |\n|              },                                                                 |\n|              \"f:selector\": {                                                    |\n|              },                                                                 |\n|              \"f:strategy\": {                                                    |\n| [...]                                                                           |\n|          \"manager\": \"kube-controller-manager\",                                  |\n|          \"operation\": \"Update\",                                                 |\n|          \"subresource\": \"status\",                                               |\n|          \"time\": \"2022-09-17T19:37:54Z\"                                         |\n|        }                                                                        |\n| +      2: {                                                                     |\n| +        \"apiVersion\": \"apps/v1\",                                               |\n| +        \"fieldsType\": \"FieldsV1\",                                              |\n| +        \"fieldsV1\": {                                                          |\n| +          \"f:spec\": {                                                          |\n| +            \"f:replicas\": {                                                    |\n| +            }                                                                  |\n| +          }                                                                    |\n| +        },                                                                     |\n| +        \"manager\": \"kubectl-edit\",                                             |\n| +        \"operation\": \"Update\",                                                 |\n| +        \"time\": \"2022-09-17T19:37:59Z\"                                         |\n| +      }                                                                        |\n|      ],                                                                         |\n|      \"name\": \"nginx\",                                                           |\n|      \"namespace\": \"default\",                                                    |\n|      \"resourceVersion\": \"178315\",                                               |\n|      \"uid\": \"4dc72be3-0a50-4fdb-b2b6-b9f50fb60976\"                              |\n|    },                                                                           |\n|    \"spec\": {                                                                    |\n|      \"progressDeadlineSeconds\": 600,                                            |\n| -    \"replicas\": 2,                                                             |\n| +    \"replicas\": 1,                                                             |\n|      \"revisionHistoryLimit\": 10,                                                |\n|      \"selector\": {                                                              |\n|        \"matchLabels\": {                                                         |\n|          \"app\": \"nginx\"                                                         |\n|        }                                                                        |\n|                                                                                 |\n+---------------------------------------------------------------------------------+\n```\n\n### Custom Base Image\n\nBuild with your own custom image with a custom Makefile:\n\n```Makefile\n# .local/Makefile\n\nIMAGE_REPO := custom.acme.org/logistis\nIMAGE_TAG := v0.0.0-dev\n\nDOCKER_BUILD_ARGS := --load \\\n\t--build-arg BASEIMAGE=custom.acme.org/golang:xyz \\\n\t--build-arg RUNIMAGE=custom.acme.org/alpine:xyz\n\nexport\n\n.DEFAULT:\n\tmake -C ../ $@\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoolen%2Flogistis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoolen%2Flogistis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoolen%2Flogistis/lists"}