{"id":41094339,"url":"https://github.com/telenornms/skogul","last_synced_at":"2026-02-11T11:16:39.244Z","repository":{"id":37431994,"uuid":"171528981","full_name":"telenornms/skogul","owner":"telenornms","description":"Generic go-based data/metric-collector-framework for Gondul and more","archived":false,"fork":false,"pushed_at":"2026-01-22T12:07:39.000Z","size":13122,"stargazers_count":32,"open_issues_count":62,"forks_count":16,"subscribers_count":4,"default_branch":"primary","last_synced_at":"2026-01-23T05:06:57.631Z","etag":null,"topics":["api","golang","hacktoberfest","http","influxdb","metrics","metrics-gathering","mysql"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/telenornms.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":"docs/CONTRIBUTING","funding":null,"license":"LICENSE","code_of_conduct":"docs/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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-02-19T18:40:32.000Z","updated_at":"2026-01-22T12:07:45.000Z","dependencies_parsed_at":"2025-11-27T14:00:58.386Z","dependency_job_id":null,"html_url":"https://github.com/telenornms/skogul","commit_stats":{"total_commits":1022,"total_committers":17,"mean_commits":60.11764705882353,"dds":0.6506849315068493,"last_synced_commit":"5be6a3084791db79be39c223714d34e06a09a5e1"},"previous_names":[],"tags_count":87,"template":false,"template_full_name":null,"purl":"pkg:github/telenornms/skogul","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/telenornms%2Fskogul","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/telenornms%2Fskogul/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/telenornms%2Fskogul/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/telenornms%2Fskogul/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/telenornms","download_url":"https://codeload.github.com/telenornms/skogul/tar.gz/refs/heads/primary","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/telenornms%2Fskogul/sbom","scorecard":{"id":725063,"data":{"date":"2025-08-11","repo":{"name":"github.com/telenornms/skogul","commit":"23810c039f251757d7d644116f8b2cc1e324dde5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.5,"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":"Code-Review","score":1,"reason":"Found 3/18 approved changesets -- score normalized to 1","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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/container-image.yml:17","Warn: no topLevel permission defined: .github/workflows/container-image.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"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":"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":"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":"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":"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: GNU Lesser General Public License v2.1: 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.31.4 not signed: https://api.github.com/repos/telenornms/skogul/releases/217527345","Warn: release artifact v0.31.3 not signed: https://api.github.com/repos/telenornms/skogul/releases/213196525","Warn: release artifact v0.31.2 not signed: https://api.github.com/repos/telenornms/skogul/releases/213190470","Warn: release artifact v0.31.1 not signed: https://api.github.com/repos/telenornms/skogul/releases/213186723","Warn: release artifact v0.31.0 not signed: https://api.github.com/repos/telenornms/skogul/releases/209581654","Warn: release artifact v0.31.4 does not have provenance: https://api.github.com/repos/telenornms/skogul/releases/217527345","Warn: release artifact v0.31.3 does not have provenance: https://api.github.com/repos/telenornms/skogul/releases/213196525","Warn: release artifact v0.31.2 does not have provenance: https://api.github.com/repos/telenornms/skogul/releases/213190470","Warn: release artifact v0.31.1 does not have provenance: https://api.github.com/repos/telenornms/skogul/releases/213186723","Warn: release artifact v0.31.0 does not have provenance: https://api.github.com/repos/telenornms/skogul/releases/209581654"],"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/container-image.yml:14"],"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/container-image.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/telenornms/skogul/container-image.yml/primary?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/container-image.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/telenornms/skogul/container-image.yml/primary?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/container-image.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/telenornms/skogul/container-image.yml/primary?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/telenornms/skogul/release.yml/primary?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/telenornms/skogul/release.yml/primary?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/telenornms/skogul/release.yml/primary?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/telenornms/skogul/test.yml/primary?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/telenornms/skogul/test.yml/primary?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating golang:latest to golang:latest@sha256:9e56f0d0f043a68bb8c47c819e47dc29f6e8f5129b8885bed9d43f058f7f3ed6","Warn: containerImage not pinned by hash: build/Dockerfile:1: pin your Docker image by updating centos:8 to centos:8@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177","Warn: containerImage not pinned by hash: build/Dockerfile.rpm-make-check:1: pin your Docker image by updating rockylinux:8 to rockylinux:8@sha256:9794037624aaa6212aeada1d28861ef5e0a935adaf93e4ef79837119f2a2d04c","Warn: downloadThenRun not pinned by hash: build/Dockerfile:8","Warn: downloadThenRun not pinned by hash: build/Dockerfile.rpm-make-check:6","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned","Info:   0 out of   2 downloadThenRun dependencies pinned","Info:   0 out of   3 containerImage 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 18 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":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw"],"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-22T12:32:40.401Z","repository_id":37431994,"created_at":"2025-08-22T12:32:40.402Z","updated_at":"2025-08-22T12:32:40.402Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29332343,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T06:13:03.264Z","status":"ssl_error","status_checked_at":"2026-02-11T06:12:55.843Z","response_time":97,"last_error":"SSL_read: 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":["api","golang","hacktoberfest","http","influxdb","metrics","metrics-gathering","mysql"],"created_at":"2026-01-22T14:55:14.306Z","updated_at":"2026-02-11T11:16:39.224Z","avatar_url":"https://github.com/telenornms.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n.. image:: https://goreportcard.com/badge/github.com/telenornms/skogul\n   :target: https://goreportcard.com/report/github.com/telenornms/skogul\n\n.. image:: https://godoc.org/github.com/telenornms/skogul?status.svg\n   :target: https://godoc.org/github.com/telenornms/skogul\n\n.. image:: https://cloud.drone.io/api/badges/telenornms/skogul/status.svg\n   :target: https://cloud.drone.io/telenornms/skogul\n\n======================================\nSkogul - generic metric/data collector\n======================================\n\nSkogul is a generic tool for moving metric data around. It can serve as a\ncollector of data, but is primarily designed to be a framework for building\nbridges between data collectors and storage engines.\n\nThis repository contains the Skogul library/package, and ``cmd/skogul``,\nwhich parses a JSON-config to set up Skogul.\n\nThe release also includes extensive documentation autogenerated, provided\nboth as a manual page (``man skogul``), and RST in ``docs/skogul.rst`` once\nbuilt.\n\nSee also the examples in `docs/examples/basics`_ \n\n.. contents:: Table of contents\n   :depth: 2\n   :local:\n\nQuickstart - RPM\n----------------\n\nIf you're on CentOS/RHEL 7 or newer, you should use our naively built RPM,\navailable at https://github.com/telenornms/skogul/releases/latest.\n\nIt will install skogul, set up a systemd service and install a simple\nconfiguration in ``/etc/skogul/conf.d/default.json``.\n\nThere's also a 64-bit Linux build there, which should work for most\nnon-RPM-based installations. But we make no attempt to really maintain it.\n\nQuickstart - Docker\n-------------------\n\nA docker image is published to ghcr.io/telenornms/skogul as of version\nv0.17.0. As of version v0.18.0, it is also published as \"latest\".\nSee the container image repository page for details:\nhttps://github.com/telenornms/skogul/pkgs/container/skogul\n\nQuickstart - source\n-------------------\n\nBuilding from source is not difficult. First you need Golang. Get it at \nhttps://golang.org/dl/ (I think you want go 1.19 or newer).\n\nBuilding ``skogul``, including cloning::\n\n   $ git clone https://github.com/telenornms/skogul\n   (...)\n   $ make\n   $ make install\n\nYou don't have to use make - there's very little magic involved for regular\nbuilding, but it will ensure ``-version`` works, along with building the\nauto-generated documentation.\n\nRunning ``make install`` installs the binary and default configuration, but\ndoes NOT install any systemd unit or similar.\n\nAlso see ``make help`` for other make targets.\n\nAbout\n-----\n\nSkogul collects, mutates and transmits metric data. It was written to\nsupport an extensive eco system of data collectors and storage engines in\nconstant motion. With Skogul, the goal is to disconnect how data is\ncollected from how it is stored: If you decide to change storage engine,\nyou should not have to even touch your collector. Or vice versa.\n\nIt can be used for very simple setups, and expanded to large,\nmulti-datacenter infrastructures with a mixture of new and old systems\nattached to it.\n\nTo accomplish this, you set up chains that define how data is received, how\nit is treated, where it goes and what happens if something goes wrong.\n\nA Skogul chain is built from one or more independent receivers which\nreceive data and pass it on to a sender. A sender can either transmit data\nto an external system (including an other Skogul instance), or add some\ninternal routing logic before passing it on to one or more other senders.\n\n.. image:: docs/imgs/basic.png\n\nUnlike most APIs or collectors of metrics, Skogul does NOT have a\npreference when it comes to storage engine. It is explicitly designed to\ndisconnect the task of how data is collected from how it is stored.\n\nThe rationale is that the problem of writing an efficient SNMP collector\nshould not be tightly coupled to where you store the data. And where you\nstore the data should not be tightly coupled with how you receive it, or\nwhat you do with it.\n\nThis enables an organization to gradually shift from older to newer stacks,\nas Skogul can both receive data on old and new transport mechanisms,\nand store it both in new and old systems. That way, older collectors can\ncontinue working how they always how worked, but send data to Skogul.\nDuring testing/maturing, Skogul can store the data in both legacy system\nand replacement system. When the legacy system is removed, no change is\nneeded on the side of the collector.\n\nExtra care has been put into making it trivial to write senders and\nreceivers.\n\nSee the package documentation over at godoc for development-related\ndocumentation: \nhttps://godoc.org/github.com/telenornms/skogul\n\nMore discussion on architecture can be found in `docs/`.\n\nModules\n-------\n\nSkogul is all based around modules. We started out with three modules, but\ntoday we have a total of five different module types. To see every module,\nuse ``skogul -help``, read the manual, or simply look in the receiver,\nsender, parser, encoder and transformer directory and read the ``auto.go``\nfile there which lists all modules.\n\nEach family of module has its own section in the JSON configuration file.\n\nWhile all modules are fundamentally equal, receivers and senders are so\nimportant that they are a little bit *more* equal, so we call them core\nmodules.\n\n.. image:: docs/imgs/modules-drawio.png\n\n............\nCore modules\n............\n\nSenders and receivers\n.....................\n\nThere are two essential module types, the receiver which defines how data\nis acquired, and senders that determine what to do with the data. A handler\nis just a collection of parser, optional transformer and reference to the\nfirst sender.\n\nCommonly used receivers are the HTTP receiver, UDP, kafka receiver\n(consumer), various file receivers, SQL receiver\n\nSenders all have the same general API, but come in two distinct types\n\nExternal senders\n................\n\nExternal senders transmit data out of Skogul and are the classic and\neasy-to-understand senders. Examples are InfluxDB sender to store data in\nInfluxDB, UDP sender, Kafka sender (producer), SQL sender, MQTT, and more.\n\nThe debug or \"print\" sender is a little special: It just prints data to\nstdout and is HIGHLY useful for testing.\n\nInternal/Logic senders\n......................\n\nLogical senders are used internally to route or do something related with\ndata. The by far most important internal sender is the batch sender, which\naccepts data, batches it into user-defined sizes, then passes them on to an\nother sender. There are a large amount of small but important logical\nsenders that can be combined to form powerful chains.\n\nOther dev favorites are: The count sender for getting statistics about how\nmuch data passes through Skogul, the switch sender for sending data to\ndifferent other senders based on metadata, dupe sender for sending the same\ndata to multiple other senders, the null sender for simply discarding data,\n\n...............\nSupport modules\n...............\n\nAdditionally, three support-type modules exists:\n\nParsers\n.......\n\nThe parser takes a set of bytes received and decodes it into a Skogul\ninternal container. E.g.: JSON decoding, protocol buffers for Juniper-data,\nInflux Line protocol data, etc and is used by receivers through handlers.\n\nEncoders\n........\n\nThe encoder does the opposite: It takes an internal Skogul container and\nencodes it as a byte stream for external tranmission. Today, only a small\namount of senders use encoders, as they are quite new, but they will be\nused more extensively in the future. Currently, only JSON is supported.\nMore to come.\n\nTransformers\n............\n\nTransformers are used to, you guessed it, transform or mutate parsed\ncontainers. Typically used to re-arrange source data to better match target\ndata, to add metadata, or to sanitize data.\n\n................\nImplicit modules\n................\n\nAll modules can be defined in configuration, but several modules have zero\nconfiguration options, or very common options. E.g.: The `skogul` parser\ndoesn't require any configuration to work, the `debug` sender works fine\nwithout any settings, the `now` transformer doesn't need any configuration\nto add current time to a metric. To save you from having to define a whole\nlot of empty modules, these type of modules can be referenced by their\nimplementation name (class, if you like) and an instance will be created\nbehind the scenes. These are listed as \"auto modules\" in the manual page.\n\nE.g., without this feature::\n\n        {\n                \"receivers\": {\n                        \"foo\": {\n                                \"type\": \"test\",\n                                \"handler\": \"myhandler\"\n                        }\n                },\n\t\t\"handlers\": {\n\t\t\t\"myhandler\": {\n\t\t\t\t\"parser\": \"skogul\",\n\t\t\t\t\"sender\": \"debug\"\n\t\t\t}\n\t\t},\n                \"parsers\": {\n                        \"skogul\": {\n                                \"type\": \"skogul\"\n                        }\n                },\n                \"senders\": {\n                        \"debug\": {\n                                \"type\": \"debug\"\n                        }\n                }\n        }\n\nBut since the Skogul parser and the debug sender has no configuration, you\ncan just omit their definition and Skogul will implicitly create them for\nyou::\n\n        {\n                \"receivers\": {\n                        \"foo\": {\n                                \"type\": \"test\",\n                                \"handler\": \"myhandler\"\n                        }\n                },\n\t\t\"handlers\": {\n\t\t\t\"myhandler\": {\n\t\t\t\t\"parser\": \"json\",\n\t\t\t\t\"sender\": \"debug\"\n\t\t\t}\n\t\t}\n        }\n\n\nPerformance\n-----------\n\nSkogul is meant to scale well. Early tests on a laptop proved to work very\nwell:\n\n.. image:: docs/imgs/skogul-rates.png\n\nThe above graph is from a very simple test on a laptop (with a quad core\ni7), using the provided tester to write data to influxdb. It demonstrates\nthat despite well-known weaknesses at the time (specially in the\ninflux-writer), we're able to push roughly 600-800k values/s through\nSkogul. This has since been exceeded.\n\nThis was an early test, and since then Skogul has been run in production on\nlarge scale systems, and generally out-performs anything it communicates\nwith.\n\nName\n----\n\nSkogul is a Valkyrie. After extensive research (5 minutes on Wikipedia with\na cross-check on duckduckgo), this name was selected because it is\nreasonably unique and is also a Valkyrie, like Gondul, a sister-project.\n\nHacking\n-------\n\nThere is little \"exotic\" about Skogul hacking, so the following sections\nare aimed mostly at people who are unfamiliar with Go.\n\nA few sources for more documentation:\n\n- docs/CODE_OF_CONDUCT.md\n- docs/CONTRIBUTING\n- docs/CODING\n- doc.go\n\n.......\nTesting\n.......\n\nIn short: Use ``make check``. It will run ``go test -short ./...`` and\nvarious other checks. There's also ``make covergui`` to do coverage\nanalysis and open it in a browser.\n\n``make check`` is run on every commit.\n\nUse ``make fmtfix`` to fix formatting issues, which also makes sure to not\nmess with the bundled/generated go files.\n\n.............\nDocumentation\n.............\n\nDocumentation comes in two forms. One is aimed at end-users. This is\nprovided mainly by adding proper labels to your data structures (see any\nsender or receiver implementation), and through hard-coded text found in\n``cmd/skogul/main.go``. In addition to this, stand-alone examples of setups\nare provided in the ``examples/`` directory.\n\nFor development, documentation is written and maintained using code\ncomments and runnable examples, following the ``godoc`` approach. Some\narchitecture comments are kept in ``docs/``, but by and large,\ndocumentation should be consumed from godoc.\n\nSee https://godoc.org/github.com/telenornms/skogul for the online\nversion, or use ``go doc github.com/telenornms/skogul`` or similar,\nas you would any other go package.\n\nExamples are part of the test suite and thus extracted from ``*_test.go``\nwhere applicable. But aren't really used much.\n\nRoadmap\n-------\n\nWe are doing frequent releases on github. I honestly don't know why no 1.0\nrelease has been made. Mainly lazyness, we've been \"almost there\" for 2+\nyears.\n\nOverall, the core modules and the scaffolding is getting pretty good.\n\nThe bigger things moving right now except new modules is logging, which has\nnever been quite right, and dealing with some legacy/deprecation.\n\nSimilarly, test cases need to be refreshed. Tests are written very\nisolated, and a good bit of spaghetti-logic has arisen. We have decent\ncoverage, but it's getting trickier to scale test case writing.\n\nWe also need better integration tests now that Skogul integrates with a\nwide variety of services.\n\nOther than that, there are modules to be written and features to be added\nwhich are mostly a matter of what needs arise.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftelenornms%2Fskogul","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftelenornms%2Fskogul","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftelenornms%2Fskogul/lists"}