{"id":34196648,"url":"https://github.com/opensciencegrid/gracc-collector","last_synced_at":"2026-03-13T13:32:06.091Z","repository":{"id":54328808,"uuid":"56730195","full_name":"opensciencegrid/gracc-collector","owner":"opensciencegrid","description":"Gratia-compatible collector for grid accounting records","archived":false,"fork":false,"pushed_at":"2021-02-23T17:33:19.000Z","size":1019,"stargazers_count":0,"open_issues_count":6,"forks_count":4,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-01-28T18:40:12.328Z","etag":null,"topics":["gracc","osg"],"latest_commit_sha":null,"homepage":"https://gracc.opensciencegrid.org","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/opensciencegrid.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":"2016-04-21T00:37:49.000Z","updated_at":"2021-02-23T17:30:08.000Z","dependencies_parsed_at":"2022-08-13T12:10:33.407Z","dependency_job_id":null,"html_url":"https://github.com/opensciencegrid/gracc-collector","commit_stats":null,"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/opensciencegrid/gracc-collector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensciencegrid%2Fgracc-collector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensciencegrid%2Fgracc-collector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensciencegrid%2Fgracc-collector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensciencegrid%2Fgracc-collector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opensciencegrid","download_url":"https://codeload.github.com/opensciencegrid/gracc-collector/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensciencegrid%2Fgracc-collector/sbom","scorecard":{"id":710033,"data":{"date":"2025-08-11","repo":{"name":"github.com/opensciencegrid/gracc-collector","commit":"528fbfec6127b224a983ef913eccaef4cc645fa7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":3,"reason":"Found 5/15 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.02.01 not signed: https://api.github.com/repos/opensciencegrid/gracc-collector/releases/3081878","Warn: release artifact v0.02.01 does not have provenance: https://api.github.com/repos/opensciencegrid/gracc-collector/releases/3081878"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":1,"reason":"dependency not pinned by hash detected -- score normalized to 1","details":["Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:13: pin your Docker image by updating alpine:latest to alpine:latest@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1","Warn: containerImage not pinned by hash: Dockerfile.build:1","Warn: containerImage not pinned by hash: Dockerfile.dev:1: pin your Docker image by updating centos:7 to centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4","Warn: containerImage not pinned by hash: Dockerfile.golang.centos7:1: pin your Docker image by updating centos:7 to centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4","Warn: containerImage not pinned by hash: Dockerfile.prod:1: pin your Docker image by updating opensciencegrid/osg-wn:3.4-el7 to opensciencegrid/osg-wn:3.4-el7@sha256:8f515b4e074d55ae9cea7556a90762dce94655f3eb0f11ded7c3708e21d46404","Warn: containerImage not pinned by hash: Dockerfile.rpmtest:1: pin your Docker image by updating centos:7 to centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4","Info:   0 out of   7 containerImage dependencies pinned","Info:   1 out of   1 goCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0322 / GHSA-cg3q-j54f-5p7p","Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T07:52:15.136Z","repository_id":54328808,"created_at":"2025-08-22T07:52:15.137Z","updated_at":"2025-08-22T07:52:15.137Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30467802,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-13T11:00:43.441Z","status":"ssl_error","status_checked_at":"2026-03-13T11:00:23.173Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["gracc","osg"],"created_at":"2025-12-15T17:19:52.999Z","updated_at":"2026-03-13T13:32:06.082Z","avatar_url":"https://github.com/opensciencegrid.png","language":"Go","readme":"[![Build Status](https://travis-ci.org/opensciencegrid/gracc-collector.svg?branch=master)](https://travis-ci.org/opensciencegrid/gracc-collector)\n\n# Overview\n\nThe gracc-collector is a \"Gratia-Compatible Collector\" that acts as a \ntransitional interface between the obsolete [Gratia](https://sourceforge.net/projects/gratia/)\naccounting collector and probes and the new GRÅCC accounting system.\n\nIt listens for bundles of records (as would be sent via replication from a \nGratia collector or from a Gratia probe) on HTTP, processes the bundle into \nindividual usage records, and sends those to RabbitMQ or another \nAMQP 0.9.1 broker.\n\n# Configuration\n\nThe config file is [TOML](https://github.com/toml-lang/toml) format.\nConfig options can also be specified by environment variables, shown\nbelow in parentheses. Environment variables override file settings.\n\n    address = \"localhost\" # address to listen on (GRACC_ADDRESS)\n    port = \"8888\"         # port to listen on (GRACC_PORT)\n    timeout = \"60s\"       # HTTP connection timeout (GRACC_TIMEOUT)\n    loglevel = \"debug\"    # log level [debug|info|warn|error|fatal|panic] (GRACC_LOGLEVEL)\n    \n    [AMQP]\n    scheme = \"amqp\"       # AMQP URI scheme [amqp|amqps] (GRACC_AMQP_SCHEME)\n    host = \"localhost\"    # AMQP broker (GRACC_AMQP_HOST)\n    port = \"5672\"         # (GRACC_AMQP_PORT)\n    vhost = \"\"            # (GRACC_AMQP_VHOST)\n    exchange = \"\"         # (GRACC_AMQP_EXCHANGE)\n    routingKey = \"\"       # (GRACC_AMQP_ROUTINGKEY)\n    durable = true        # keep exchange between server restarts (GRACC_AMQP_DURABLE)\n    autoDelete = true     # delete exchange when there are no remaining bindings (GRACC_AMQP_AUTODELETE)\n    user = \"guest\"        # (GRACC_AMQP_USER)\n    password = \"guest\"    # (GRACC_AMQP_PASSWORD)\n    format = \"raw\"        # format to send record in [raw|xml|json] (GRACC_AMQP_FORMAT)\n    retry = \"10s\"         # AMQP connection retry interval (GRACC_AMQP_RETRY)\n\n# Usage\n\n    gracc-collector [-c \u003cconfig file\u003e] [-l \u003clog file\u003e] [-pprof on|\u003caddress:port\u003e]\n\nWhere `\u003clog file\u003e` can be \"stdout\", \"stderr\", or a file name; default is \"stderr\".\n`-pprof on` will expose [pprof](https://blog.golang.org/profiling-go-programs) on the main http server at `/debug/pprof/`. \n`-pprof \u003caddress:port\u003e` will expose it on a separate http server as specified, also at `/debug/pprof/`.\n\nSee `sample/gracc.service` for a sample systemd unit configuration. Copy the file (with \nappropriate changes) to `/usr/lib/systemd/system/` then use standard systemd commands to\ncontrol the process.\n\n* Start: `systemctl start gracc.service`\n* Stop:  `systemctl stop gracc.service`\n* Restart:  `systemctl restart gracc.service`\n* Refresh log file:  `systemctl kill --signal=SIGUSR1 gracc.service`\n* Toggle debug logging:  `systemctl kill --signal=SIGUSR2 gracc.service`\n\nSee `sample/gracc.logrotate` for a sample logrotate configuration. Copy the file (with\nappropriate changes) to `/etc/logrotate.d/gracc`.\n\n# Creating a Release\n\nTo create a release, one must do the following:\n\n1.  Merge a commit to master updating the release notes in `README.md` and `gracc-collector.spec`.\n2.  Create a release in the `gracc-collector` GitHub repository; this will create a new release.\n3.  Head over to the OSG packaging repository and update the `gracc-collector` packaging there;\n    you will need to at least copy over the `gracc-collector.spec` and the update the git SHA1\n    associated with the release. Steps 1-3 should take 15 minutes.\n4.  Utilize the OSG build tools to do an official build of the `gracc-collector` RPM in Koji.\n    This should take 15 minutes.\n5.  Wait until the GOC synchronizes the updated `gracc-collector` RPM to the `osg-development`\n    repository.  Estimated wait time is 2 hours.\n6.  Run `make release`; this will update the local Dockerfile and perform a commit.  Run\n    `docker build .` to ensure the generated image contains the correct `gracc-collector` version.\n7.  If all looks good, push the updated Dockerfile to GitHub; this will trigger the DockerHub\n    build.\n\n# Release Notes\n\n### v1.1.7\n\n* Add persistence to the messages to last through a AMQP server reboot.\n\n### v1.1.6\n\n* Allow Dockerfile releases to be made via osg-development repository.\n* Add appropriate license file.\n\n### v1.1.5\n\n* Add support for X-Forwarded-For / X-Real-IP headers, for when the collector is\n  running behind a HTTP proxy\n\n### v1.1.4\n\n* Fix issue causing collector to never see AMQP unblock signal.\n\n### v1.1.3\n\n* Better handling of AMQP connection blocking: If the connection is blocked \n  for a long time, existing HTTP connections will time out and return an error, \n  rather than staying open indefinitely. New HTTP connections will immediately \n  return an error.\n* Improved error handling and HTTP responses.\n\n### v1.1.2\n\nFix resource leak when rabbitmq is down.\n\n### v1.1.1\n\nAdd configurable AMQP scheme to support TLS connections to broker.\n\n### v1.1.0\n\nAccept UsageRecord (treated identically as JobUsageRecord).\n\n### v1.0.0\n\n* Feature-complete for initial production deployment to replace Gratia collector.\n* Accept XML record bundles (\"multiupdate\") as would typically be sent by a probe.\n\n### v0.4.0\n\n* Allow config options to be set by environment variable. \n  Precedence: env var \u003e config file \u003e default.\n* Change timeout and AMQP.retry config options to duration strings.\n  A duration string is a possibly signed sequence of decimal numbers, each with\n  optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". \n  Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\". \n\n### v0.03.01\n\nFully flatten JobUsageRecord into simple key:value hash map.\n\n### v0.03.00\n\nRevised JSON output structure based on OGF UsageRecord and switch default output to JSON.\n\n[Mapping documentation](https://opensciencegrid.github.io/gracc/dev-docs/raw-records/)\n\n### v0.02.00\n\nSignificant rewrite to simplify while maintaining robust error handling.\n\n* Removed unneeded file, elasticsearch, and kafka outputs.\n* One AMQP channel is opened for each bundle received; the HTTP connection\n  from the probe or collector is not closed until all records are confirmed\n  by the AMQP broker. If an error occurs or a record is returned then a 500\n  error code is returned.\n\n### v0.01.10\n\n* Handle AMQP returned records\n* Improved parsing of record bundles\n\n### v0.01.09\n\n* Better handling for AMQP communication errors\n\n### v0.01.08\n\n* Support multiple AMQP workers\n* Timeout if output filter is blocking too long, respond to request with error code so bundle gets re-sent later\n* Improved log messages and responses\n\n### v0.01.07\n\nCreated internal queues for outputting records.\n\n### v0.01.05\n\nAdd basic collector statistics served at /stats.\n\n### v0.01.04\n\nAdd option to write records to RabbitMQ.\n\n### v0.01.03\n\nAdd option to write records to file.\n\n### v0.01.02\n\nAdd option to send records to Kafka topic.\n\n### v0.01.01\n\nInitial dev version, send records to Elasticsearch.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensciencegrid%2Fgracc-collector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopensciencegrid%2Fgracc-collector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensciencegrid%2Fgracc-collector/lists"}