{"id":13693797,"url":"https://github.com/adobe/butler","last_synced_at":"2025-05-03T00:31:54.769Z","repository":{"id":57564618,"uuid":"136384097","full_name":"adobe/butler","owner":"adobe","description":"Butler CMS (Configuration Management System)","archived":false,"fork":false,"pushed_at":"2024-04-08T12:49:39.000Z","size":2869,"stargazers_count":13,"open_issues_count":17,"forks_count":12,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-11-12T20:46:04.908Z","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":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adobe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-06-06T20:44:06.000Z","updated_at":"2023-07-25T14:17:40.000Z","dependencies_parsed_at":"2024-06-20T03:19:31.236Z","dependency_job_id":"bdcc8517-2c85-4aa6-b81c-55f7fac18761","html_url":"https://github.com/adobe/butler","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/adobe%2Fbutler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adobe%2Fbutler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adobe%2Fbutler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adobe%2Fbutler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adobe","download_url":"https://codeload.github.com/adobe/butler/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252126634,"owners_count":21698964,"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-08-02T17:01:17.950Z","updated_at":"2025-05-03T00:31:49.750Z","avatar_url":"https://github.com/adobe.png","language":"Go","funding_links":[],"categories":["开源类库","Open source library"],"sub_categories":["配置","Construction"],"readme":"# Butler CMS\n[![Go Report Card][3]][4] [![Build Status][5]][6] [![codecov][7]][8]\n![Butler Logo][0]\n\n## Butler CMS (Configuration Management System) Overview\nThe Butler CMS (butler) tool is designed to grab any configuration files, defined in its configuration file, from a remote location/repository via http(s)/s3(AWS)/blob(Azure)/file/etcd and side load them onto another locally running container.\n\nThe butler configuration file is a [TOML](https://github.com/toml-lang/toml) formatted file. You can store the file locally (using a mounted filesystem), or on a remote server. The proper formatting for the config file can be found [here](https://github.com/adobe/butler/tree/master/contrib)\n\n### Butler at 30,000 feet\nHere is a quick diagram that contains all the elements of what butler does, and how it is intended to interact with other systems.\n\n![Butler Elements][1]\n\n### Butler Workflow\nTo help understand more of how butler functions, here is a work flow diagram showing, in more detail, the work butler does.\n\n![Butler Workflow][2]\n\n## Usage\nThere are various ways that you can run butler. We will ultimately deploy butler via DCOS, and you can run this on your local machine to do some testing.\n\n### Command Line Usage\n```\n[16:06]pts/22:49(stegen@woden):[~]%\n./butler -h\nUsage of ./butler:\n  -config.path string\n        Full remote path to butler configuration file (eg: full URL scheme://path).\n  -config.retrieve-interval string\n        The interval, in seconds, to retrieve new butler configuration files. (default \"300\")\n  -etcd.endpoints string\n        The endpoints to connect to etcd.\n  -http.auth_token string\n        HTTP auth token to use for HTTP authentication.\n  -http.auth_type string\n        HTTP auth type (eg: basic / digest / token-key) to use. If empty (by default) do not use HTTP authentication.\n  -http.auth_user string\n        HTTP auth user to use for HTTP authentication\n  -http.retries string\n        The number of http retries for GET requests to obtain the butler configuration files (default \"5\")\n  -http.retry_wait_max string\n        The maximum amount of time to wait before attemping to retry the http config get operation. (default \"15\")\n  -http.retry_wait_min string\n        The minimum amount of time to wait before attemping to retry the http config get operation. (default \"5\")\n  -http.timeout string\n        The http timeout, in seconds, for GET requests to obtain the butler configuration file. (default \"10\")\n  -log.level string\n        The butler log level. Log levels are: debug, info, warn, error, fatal, panic. (default \"info\")\n  -s3.region string\n        The S3 Region that the config file resides.\n  -test\n        Are we testing butler? (probably not!)\n  -tls.insecure-skip-verify\n        Disable SSL verification for etcd and https.\n  -version\n        Print version information.\n\n[16:08]pts/22:50(stegen@woden):[~]%\n\n\n```\n\nValid schemes are: blob (Azure), etcd, file, http (or https), and s3 (AWS)\n\n### Use of Environment Variables\nButler supports the usre of environment variables. Any field that is prefixed with `env:` will be looked up in the environment. This will work for all command line options, and MOST configuration file options.\n\nThere are only a few places in the configuration file where environment variables will not be used. Any value that is used which defines a new section/nest for the butler configuration will not look up any environment variables. This is due to how the configuration file is nested.\n\nFor example, the following settings will not do environment variable lookups.\n1. In the `config-managers` section of the `butler.toml` where configuration managers are defined.\n1. As the definition for the configuration manager.\n1. In the `repos` section in the configuration manager section.\n1. As the definition for the configuration manager repository.\n1. As the `method` in the configuration manager repository.\n1. As the definition for the configuration manager repository.\n\nYou should get the gist at this point. Refer to the butler.toml.sample configuration for additional examples.\n\n### Example Command Line Usage\n#### HTTP/HTTPS CLI\n```\n[14:24]pts/12:21(stegen@woden):[~]% ./butler -config.path http://localhost/butler/config/butler.toml -config.retrieve-interval 10 -log.level info\nINFO[2017-10-11T14:24:29+01:00] Starting Butler CMS version v1.2.1\n^C\n\n[master]\n[14:24]pts/12:22(stegen@woden):[~]%\n```\nWhen you execute butler with the above arguments, you are asking butler to grab its configuration file from http://localhost/butler/config/butler.toml, and try to re-retrieve and refresh it every 10 seconds. It will also use the default log level of INFO. If you need more verbosity to your output, specify `debug` as the logging level argument.\n\n##### HTTP/HTTPS CLI Authentication\nButler CMS supports both Basic and Digest based HTTP authentication. If your butler.toml is behind an authenticated webserver, then on the CLI you must provide the following flags:\n1. `-http.auth_type` - This is the backend authentication type. Choose either `basic`, `digest`, or `token-key`.\n1. `-http.auth_user` - This is the user to authenticate as.\n1. `-http.auth_token` - This is the authentication token.\n\nWith any of these flags, they can be retrieved form the environment. Refer to the \"Use of Environment Variables\" section for more information.\n\n###### Authentication Types\n1. basic - This is your standard `Authorization: basic` header.\n1. digest - This is your sandard `Authorization: digest` header.\n1. token-key - This is a custom `Authorization: token=foo, key=bar` header. Use -http.auth_user field for token and -http.auth_token field for the key.\n\n#### etcd CLI\n```\n[12:34]pts/16:3(stegen@woden):[~]% ./butler -config.path etcd://etcd.mesos/butler/butler.toml -etcd.endpoints http://etcd.mesos:1026 -log.level info\nINFO[2018-05-10T11:34:05Z] Starting Butler CMS version v1.2.1\nINFO[2018-05-10T11:34:05Z] Config::Init(): initializing butler config.\nWARN[2018-05-10T11:34:05Z] ButlerConfig::Init() Above \\\"NewHttpMethod(): could not convert\\\" warnings may be safely disregarded.\nINFO[2018-05-10T11:34:05Z] Config::Init(): butler config initialized.\nINFO[2018-05-10T11:34:05Z] ButlerConfig::Handler(): entering.\nINFO[2018-05-10T11:34:05Z] Config::RunCMHandler(): entering\n^C\n[12:34]pts/16:4(stegen@woden):[~]%\n```\n\nYou can grab the butler.toml directly from etcd, and you can also create a repo which utilizes etcd within the butler.toml. Refer to [this example](https://github.com/adobe/butler/blob/master/contrib/butler.toml.etcdtest).\n\nYou can easily add the files into etcd by the following commands:\n```\netcdctl --endpoint http://etcd.mesos:1026 mkdir /butler\netcdctl --endpoint http://etcd.mesos:1026 set /butler/butler.toml \"$(cat /tmp/butler.toml)\"\n```\nNote that this should support both etcd v2 and v3.\n\n#### S3 CLI\n```\n[14:24]pts/12:21(stegen@woden):[~]% ./butler -config.path s3://s3-bucket/config/butler.toml -config.retrieve-interval 10 -log.level info -s3.region \u003caws-region\u003e\nINFO[2017-10-11T14:24:29+01:00] Starting Butler CMS version v1.2.1\n^C\n\n[master]\n[14:24]pts/12:22(stegen@woden):[~]%\n```\nWhen you execute butler with the above arguments, you are asking butler to grab its configuration file from S3 storage using bucket `s3-bucket`, file key `config/butler.toml` and the aws-region as specified by `s3.region`, and try to re-retrieve and refresh it every 10 seconds. It will also use the default log level of INFO. If you need more verbosity to your output, specify `debug` as the logging level argument.\n\n#### Azure CLI and Usage\nIn order to use the butler Azure CLI, you must set the appropriate environment variables.\n1. `BUTLER_STORAGE_TOKEN` - This is the API Token to your Azure Storage Container resource\n\nThe following environment variable is optional\n1. `BUTLER_STORAGE_ACCOUNT`- This is the name of the Azure Storage Account. You can either specify this in the environment, or you can specify it in the butler.toml configuration file. See the example file for reference under `./contrib/butler.toml.sample`.\n\nThe command line option looks like this:\n\n`[14:24]pts/12:21(stegen@woden):[~]% ./butler -config.path blob://azure-storage-account/azure-blob-container/butler.toml -config.retrieve-interval 10 -log.level info`\n\n### DCOS Deployment JSON\n```\n{\n  \"volumes\": null,\n  \"id\": \"/prometheus-server-butler2\",\n  \"cmd\": null,\n  \"args\": [\n    \"-config.path\",\n    \"http://server/butler.toml\"\n  ],\n  \"user\": null,\n  \"env\": null,\n  \"instances\": 1,\n  \"cpus\": 0.05,\n  \"mem\": 20,\n  \"disk\": 0,\n  \"gpus\": 0,\n  \"executor\": null,\n  \"constraints\": [\n    [\n      \"hostname\",\n      \"LIKE\",\n      \"1.2.3.4\"\n    ],\n    [\n      \"hostname\",\n      \"UNIQUE\"\n    ]\n  ],\n  \"fetch\": null,\n  \"storeUrls\": null,\n  \"backoffSeconds\": 1,\n  \"backoffFactor\": 1.15,\n  \"maxLaunchDelaySeconds\": 3600,\n  \"container\": {\n    \"docker\": {\n      \"image\": \"matthsmi/butler:x.y.z\",\n      \"forcePullImage\": false,\n      \"privileged\": false,\n      \"parameters\": [\n        {\n          \"key\": \"volume\",\n          \"value\": \"/opt/prometheus:/opt/prometheus:z,rw\"\n        }\n      ],\n      \"portMappings\": [\n        {\n          \"containerPort\": 8080,\n          \"protocol\": \"tcp\",\n          \"servicePort\": 10057\n        }\n      ],\n      \"network\": \"BRIDGE\"\n    }\n  },\n  \"healthChecks\": [\n    {\n      \"protocol\": \"HTTP\",\n      \"path\": \"/health-check\",\n      \"gracePeriodSeconds\": 5,\n      \"intervalSeconds\": 20,\n      \"timeoutSeconds\": 20,\n      \"maxConsecutiveFailures\": 3,\n      \"ignoreHttp1xx\": false\n    }\n  ],\n  \"readinessChecks\": null,\n  \"dependencies\": null,\n  \"upgradeStrategy\": {\n    \"minimumHealthCapacity\": 1,\n    \"maximumOverCapacity\": 1\n  },\n  \"labels\": null,\n  \"acceptedResourceRoles\": [\n    \"*\",\n    \"slave_public\"\n  ],\n  \"residency\": null,\n  \"secrets\": null,\n  \"taskKillGracePeriodSeconds\": null,\n  \"portDefinitions\": [\n    {\n      \"port\": 10057,\n      \"protocol\": \"tcp\",\n      \"labels\": {\n      }\n    }\n  ],\n  \"requirePorts\": false\n}\n```\n\n## Butler Configuration File\nRefer to the contrib/ directory for more information about the butler.toml configuration file, and all its features.\n\n## Building\n\n## Testing\nButler has some unit testing, and some acceptance testing.\n\nThe unit testing is using the check.v1 testing package (gopkg.in/check.v1). The code coverage is not very impressive, but we continue to add test cases as we go. If you want to run the unit tests, just run `make test-unit`.\n\nThe acceptance testing tries to do some tests of how butler operates overall. You can provide a the butler binary with a configuration file, and run it with the `-test` flag. What this tells butler to do is to just perform a full config operation once. If there are percieved failures, it'll quit out with unix status code 1. For example, if it's unable to parse a configuration, or get some variables that it needs, it will exit out. It should also, hopefully, catch bugs which aren't caught in the unit testing, where panics may get invoked from calls that are made from functions that cannot be easily unit tested, but could be caught when running against actual configuration.\n\nOut of the box, it tests some http:// https:// file:// endoints, which it can handle internally.\n\nThere are two additional scripts which can test against s3:// and blob:// storage. For both of these, you must set the appropriate environment variables for authenticating to the respective AWS or Azure storage service.\n### Blob Testing\nTo test against Blob storage, you will need to export two environment variables:\n1. `BUTLER_BLOB_TEST_CONFIGS`\n1. `BUTLER_BLOB_TEST_RESPONSES`\n\n`BUTLER_BLOB_TEST_CONFIGS` is a space delimited list of urls to test against.\n`BUTLER_BLOB_TEST_RESPONSES` is a space delimited list of return codes which are expected against the list of delimited urls.\n\nHere is an example:\n```\nexport BUTLER_BLOB_TEST_CONFIGS=\"blob://stegentestblobva7/butler/butler1.toml blob://stegentestblobva7/butler/butler2.toml blob://stegentestblobva7/butler/butler3.toml\"\nexport BUTLER_BLOB_TEST_RESPONSES=\"0 0 1\"\n```\n\nThe actual script that gets executed is `./files/tests/scripts/azure.sh`\n\n### S3 Testing\nTo test against S3 storage, you will need to export two environment variables:\n1. `BUTLER_S3_TEST_CONFIGS`\n1. `BUTLER_S3_TEST_RESPONSES`\n\n`BUTLER_S3_TEST_CONFIGS` is a space delimited list of urls to test against.\n`BUTLER_S3_TEST_RESPONSES` is a space delimited list of return codes which are expected against the list of delimited urls.\n\nHere is an example:\n```\nexport BUTLER_S3_TEST_CONFIGS=\"s3://stegen-test-bucket/butler1.toml s3://stegen-test-bucket/butler2.toml s3://stegen-test-bucket/butler3.toml\"\nexport BUTLER_S3_TEST_RESPONSES=\"0 1 1\"\n```\n\nThe actual script that gets executed is `./files/tests/scripts/s3.sh`\n\nIf you want to run the acceptance testing, just run `make test-accept`.\n\n## Health Checks\nbutler provides DCOS health checks by exposing an http service with a /health-check endpoint. It exposes various configuration, and realtime information in JSON format regarding the butler process.\n```\n[12:54]pts/11:13(stegen@woden):[~]% http get localhost:8080/health-check\nHTTP/1.1 200 OK\nContent-Type: application/json\nDate: Thu, 12 Oct 2017 10:44:50 GMT\nTransfer-Encoding: chunked\n\n{\n    \"config-path\": \"http://localhost/butler/config/butler.toml\", \n    \"config-settings\": {\n        \"globals\": {\n            \"exit-on-failure\": false, \n            \"scheduler-interval\": 10\n        }, \n        \"managers\": {\n            \"alertmanager\": {\n                \"cache-path\": \"/opt/cache/alertmanager\", \n                \"clean-files\": true, \n                \"dest-path\": \"/opt/alertmanager\", \n                \"enable-cache\": true, \n                \"last-run\": \"2017-10-12T11:44:50.29930327+01:00\", \n                \"mustache-subs\": {\n                    \"endpoint\": \"external\", \n                    \"ethos-cluster-id\": \"ethos01-dev-or1\"\n                }, \n                \"name\": \"alertmanager\", \n                \"opts\": {\n                    \"alertmanager.repo3.domain.com\": {\n                        \"additional-config\": null, \n                        \"method\": \"http\", \n                        \"opts\": {\n                            \"retries\": 5, \n                            \"retry-wait-max\": 10, \n                            \"retry-wait-min\": 5, \n                            \"timeout\": 10\n                        }, \n                        \"primary-config\": [\n                            \"alertmanager.yml\"\n                        ], \n                        \"repo\": \"repo3.domain.com\", \n                        \"uri-path\": \"/butler/configs/alertmanager\"\n                    }, \n                    \"alertmanager.repo4.domain.com\": {\n                        \"additional-config\": null, \n                        \"method\": \"http\", \n                        \"opts\": {\n                            \"retries\": 5, \n                            \"retry-wait-max\": 10, \n                            \"retry-wait-min\": 5, \n                            \"timeout\": 10\n                        }, \n                        \"primary-config\": [\n                            \"alertmanager-2.yml\"\n                        ], \n                        \"repo\": \"repo4.domain.com\", \n                        \"uri-path\": \"/butler/configs/alertmanager\"\n                    }\n                }, \n                \"primary-config-name\": \"alertmanager.yml\", \n                \"reloader\": {\n                    \"method\": \"http\", \n                    \"opts\": {\n                        \"content-type\": \"application/json\", \n                        \"host\": \"localhost\", \n                        \"method\": \"post\", \n                        \"payload\": \"{}\", \n                        \"port\": 9093, \n                        \"retries\": 5, \n                        \"retry-wait-max\": 10, \n                        \"retry-wait-min\": 5, \n                        \"timeout\": 10, \n                        \"uri\": \"/-/reload\"\n                    }\n                }, \n                \"urls\": [\n                    \"repo3.domain.com\", \n                    \"repo4.domain.com\"\n                ]\n            }, \n            \"prometheus\": {\n                \"cache-path\": \"/opt/cache/prometheus\", \n                \"clean-files\": true, \n                \"dest-path\": \"/opt/prometheus\", \n                \"enable-cache\": true, \n                \"last-run\": \"2017-10-12T11:44:50.29659399+01:00\", \n                \"mustache-subs\": {\n                    \"endpoint\": \"external\", \n                    \"ethos-cluster-id\": \"ethos01-dev-or1\"\n                }, \n                \"name\": \"prometheus\", \n                \"opts\": {\n                    \"prometheus.repo1.domain.com\": {\n                        \"additional-config\": [\n                            \"alerts/commonalerts.yml\", \n                            \"butler/butler.yml\"\n                        ], \n                        \"method\": \"http\", \n                        \"opts\": {\n                            \"retries\": 5, \n                            \"retry-wait-max\": 10, \n                            \"retry-wait-min\": 5, \n                            \"timeout\": 10\n                        }, \n                        \"primary-config\": [\n                            \"prometheus.yml\", \n                            \"prometheus-other.yml\"\n                        ], \n                        \"repo\": \"repo1.domain.com\", \n                        \"uri-path\": \"/butler/configs/prometheus\"\n                    }, \n                    \"prometheus.repo2.domain.com\": {\n                        \"additional-config\": [\n                            \"alerts/tenant.yml\", \n                            \"butler/butler-repo2.yml\"\n                        ], \n                        \"method\": \"http\", \n                        \"opts\": {\n                            \"retries\": 5, \n                            \"retry-wait-max\": 10, \n                            \"retry-wait-min\": 5, \n                            \"timeout\": 10\n                        }, \n                        \"primary-config\": [\n                            \"prometheus-repo2.yml\", \n                            \"prometheus-repo2-other.yml\"\n                        ], \n                        \"repo\": \"repo2.domain.com\", \n                        \"uri-path\": \"/butler/configs/prometheus\"\n                    }\n                }, \n                \"primary-config-name\": \"prometheus.yml\", \n                \"reloader\": {\n                    \"method\": \"http\", \n                    \"opts\": {\n                        \"content-type\": \"application/json\", \n                        \"host\": \"localhost\", \n                        \"method\": \"post\", \n                        \"payload\": \"{}\", \n                        \"port\": 9090, \n                        \"retries\": 5, \n                        \"retry-wait-max\": 10, \n                        \"retry-wait-min\": 5, \n                        \"timeout\": 10, \n                        \"uri\": \"/-/reload\"\n                    }\n                }, \n                \"urls\": [\n                    \"repo1.domain.com\", \n                    \"repo2.domain.com\"\n                ]\n            }\n        }\n    }, \n    \"log-level\": 5, \n    \"retrieve-interval\": 10, \n    \"version\": \"v1.0.0\"\n}\n\n[master]\n[13:02]pts/11:14(stegen@woden):[~]%\n```\n## Prometheus Metrics\nbutler provides native Prometheus of the butler go binary by exposing an http service with a /metrics endpoint. This includes both butler specific metric information (prefixed with `butler_`), and internal go and process related metrics (prefixed with `go_` and `process_`)\n```\n[13:04]pts/11:15(stegen@woden):[~]% http get localhost:8080/metrics \nHTTP/1.1 200 OK\nContent-Encoding: gzip\nContent-Length: 1381\nContent-Type: text/plain; version=0.0.4\nDate: Wed, 26 Jul 2017 12:04:57 GMT\n\n# HELP butler_localconfig_reload_success Did butler successfully reload prometheus\n# TYPE butler_localconfig_reload_success gauge\nbutler_localconfig_reload_success 1\n# HELP butler_localconfig_reload_time Time that butler successfully reload prometheus\n# TYPE butler_localconfig_reload_time gauge\nbutler_localconfig_reload_time 1.501070697e+09\n# HELP butler_localconfig_render_success Did butler successfully render the prometheus.yml\n# TYPE butler_localconfig_render_success gauge\nbutler_localconfig_render_success 1\n# HELP butler_localconfig_render_time Time that butler successfully rendered the prometheus.yml\n# TYPE butler_localconfig_render_time gauge\nbutler_localconfig_render_time 1.501070527e+09\n# HELP butler_remoterepo_config_valid Is the butler configuration valid\n# TYPE butler_remoterepo_config_valid gauge\nbutler_remoterepo_config_valid{config_file=\"commonalerts.yml\"} 1\nbutler_remoterepo_config_valid{config_file=\"prometheus.yml\"} 1\nbutler_remoterepo_config_valid{config_file=\"tenant.yml\"} 1\n# HELP butler_remoterepo_contact_success Did butler successfully contact the remote repository\n# TYPE butler_remoterepo_contact_success gauge\nbutler_remoterepo_contact_success{config_file=\"commonalerts.yml\"} 1\nbutler_remoterepo_contact_success{config_file=\"prometheus.yml\"} 1\nbutler_remoterepo_contact_success{config_file=\"tenant.yml\"} 1\n# HELP butler_remoterepo_contact_time Time that butler successfully contacted the remote repository\n# TYPE butler_remoterepo_contact_time gauge\nbutler_remoterepo_contact_time{config_file=\"commonalerts.yml\"} 1.501070685e+09\nbutler_remoterepo_contact_time{config_file=\"prometheus.yml\"} 1.501070697e+09\nbutler_remoterepo_contact_time{config_file=\"tenant.yml\"} 1.501070685e+09\n# HELP go_gc_duration_seconds A summary of the GC invocation durations.\n# TYPE go_gc_duration_seconds summary\ngo_gc_duration_seconds{quantile=\"0\"} 0.000236024\ngo_gc_duration_seconds{quantile=\"0.25\"} 0.000236024\ngo_gc_duration_seconds{quantile=\"0.5\"} 0.000236024\ngo_gc_duration_seconds{quantile=\"0.75\"} 0.000236024\ngo_gc_duration_seconds{quantile=\"1\"} 0.000236024\ngo_gc_duration_seconds_sum 0.000236024\ngo_gc_duration_seconds_count 1\n# HELP go_goroutines Number of goroutines that currently exist.\n# TYPE go_goroutines gauge\ngo_goroutines 18\n# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.\n# TYPE go_memstats_alloc_bytes gauge\ngo_memstats_alloc_bytes 3.3794e+06\n# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.\n# TYPE go_memstats_alloc_bytes_total counter\ngo_memstats_alloc_bytes_total 6.070552e+06\n# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table.\n# TYPE go_memstats_buck_hash_sys_bytes gauge\ngo_memstats_buck_hash_sys_bytes 1.445366e+06\n# HELP go_memstats_frees_total Total number of frees.\n# TYPE go_memstats_frees_total counter\ngo_memstats_frees_total 15629\n# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata.\n# TYPE go_memstats_gc_sys_bytes gauge\ngo_memstats_gc_sys_bytes 333824\n# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use.\n# TYPE go_memstats_heap_alloc_bytes gauge\ngo_memstats_heap_alloc_bytes 3.3794e+06\n# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used.\n# TYPE go_memstats_heap_idle_bytes gauge\ngo_memstats_heap_idle_bytes 106496\n# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use.\n# TYPE go_memstats_heap_inuse_bytes gauge\ngo_memstats_heap_inuse_bytes 4.251648e+06\n# HELP go_memstats_heap_objects Number of allocated objects.\n# TYPE go_memstats_heap_objects gauge\ngo_memstats_heap_objects 17404\n# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS.\n# TYPE go_memstats_heap_released_bytes gauge\ngo_memstats_heap_released_bytes 0\n# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system.\n# TYPE go_memstats_heap_sys_bytes gauge\ngo_memstats_heap_sys_bytes 4.358144e+06\n# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.\n# TYPE go_memstats_last_gc_time_seconds gauge\ngo_memstats_last_gc_time_seconds 1.5010706071801429e+09\n# HELP go_memstats_lookups_total Total number of pointer lookups.\n# TYPE go_memstats_lookups_total counter\ngo_memstats_lookups_total 466\n# HELP go_memstats_mallocs_total Total number of mallocs.\n# TYPE go_memstats_mallocs_total counter\ngo_memstats_mallocs_total 33033\n# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures.\n# TYPE go_memstats_mcache_inuse_bytes gauge\ngo_memstats_mcache_inuse_bytes 9600\n# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system.\n# TYPE go_memstats_mcache_sys_bytes gauge\ngo_memstats_mcache_sys_bytes 16384\n# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures.\n# TYPE go_memstats_mspan_inuse_bytes gauge\ngo_memstats_mspan_inuse_bytes 45144\n# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system.\n# TYPE go_memstats_mspan_sys_bytes gauge\ngo_memstats_mspan_sys_bytes 49152\n# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place.\n# TYPE go_memstats_next_gc_bytes gauge\ngo_memstats_next_gc_bytes 4.194304e+06\n# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations.\n# TYPE go_memstats_other_sys_bytes gauge\ngo_memstats_other_sys_bytes 1.012482e+06\n# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator.\n# TYPE go_memstats_stack_inuse_bytes gauge\ngo_memstats_stack_inuse_bytes 884736\n# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator.\n# TYPE go_memstats_stack_sys_bytes gauge\ngo_memstats_stack_sys_bytes 884736\n# HELP go_memstats_sys_bytes Number of bytes obtained from system.\n# TYPE go_memstats_sys_bytes gauge\ngo_memstats_sys_bytes 8.100088e+06\n# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.\n# TYPE process_cpu_seconds_total counter\nprocess_cpu_seconds_total 0.12\n# HELP process_max_fds Maximum number of open file descriptors.\n# TYPE process_max_fds gauge\nprocess_max_fds 1024\n# HELP process_open_fds Number of open file descriptors.\n# TYPE process_open_fds gauge\nprocess_open_fds 31\n# HELP process_resident_memory_bytes Resident memory size in bytes.\n# TYPE process_resident_memory_bytes gauge\nprocess_resident_memory_bytes 1.0821632e+07\n# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.\n# TYPE process_start_time_seconds gauge\nprocess_start_time_seconds 1.50107052601e+09\n# HELP process_virtual_memory_bytes Virtual memory size in bytes.\n# TYPE process_virtual_memory_bytes gauge\nprocess_virtual_memory_bytes 2.39341568e+08\n\n\n[master]\n[13:04]pts/11:16(stegen@woden):[~]%\n```\n### Contributing\n\nContributions are welcomed! Read the [Contributing Guide](CONTRIBUTING.md) for more information.\n\n### Licensing\n\nThis project is licensed under the Apache V2 License. See [LICENSE](LICENSE) for more information.\n\n[0]: https://github.com/adobe/butler/raw/master/contrib/images/butler.png\n[1]: https://github.com/adobe/butler/raw/master/contrib/diagrams/png/Butler%20Elements.png\n[2]: https://github.com/adobe/butler/raw/master/contrib/diagrams/png/Butler%20Workflow.png\n[3]: https://goreportcard.com/badge/github.com/adobe/butler\n[4]: https://goreportcard.com/report/github.com/adobe/butler\n[5]: https://travis-ci.org/adobe/butler.svg?branch=master\n[6]: https://travis-ci.org/adobe/butler\n[7]: https://codecov.io/gh/adobe/butler/branch/master/graph/badge.svg\n[8]: https://codecov.io/gh/adobe/butler\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadobe%2Fbutler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadobe%2Fbutler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadobe%2Fbutler/lists"}