{"id":19762589,"url":"https://github.com/statful/statful-client-java","last_synced_at":"2025-10-10T17:13:46.860Z","repository":{"id":50117014,"uuid":"64424185","full_name":"statful/statful-client-java","owner":"statful","description":"Statful client for Java applications. This client is intended to gather metrics and send them to Statful. ","archived":false,"fork":false,"pushed_at":"2021-06-03T23:50:49.000Z","size":429,"stargazers_count":9,"open_issues_count":4,"forks_count":5,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-07-28T21:14:38.620Z","etag":null,"topics":["java","metrics","performance","statful"],"latest_commit_sha":null,"homepage":"https://www.statful.com/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/statful.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-07-28T19:56:26.000Z","updated_at":"2020-11-03T05:28:27.000Z","dependencies_parsed_at":"2022-09-26T21:51:21.085Z","dependency_job_id":null,"html_url":"https://github.com/statful/statful-client-java","commit_stats":null,"previous_names":[],"tags_count":29,"template":false,"template_full_name":null,"purl":"pkg:github/statful/statful-client-java","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statful%2Fstatful-client-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statful%2Fstatful-client-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statful%2Fstatful-client-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statful%2Fstatful-client-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/statful","download_url":"https://codeload.github.com/statful/statful-client-java/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statful%2Fstatful-client-java/sbom","scorecard":{"id":846757,"data":{"date":"2025-08-11","repo":{"name":"github.com/statful/statful-client-java","commit":"54e996acc32c493bd7f5e956fe17ca2ea50fc4a3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":1,"reason":"Found 5/27 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":"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":"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":"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":"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":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"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":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 8 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":"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"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-23T21:40:00.206Z","repository_id":50117014,"created_at":"2025-08-23T21:40:00.206Z","updated_at":"2025-08-23T21:40:00.206Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279004822,"owners_count":26083784,"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","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["java","metrics","performance","statful"],"created_at":"2024-11-12T04:05:18.804Z","updated_at":"2025-10-10T17:13:46.818Z","avatar_url":"https://github.com/statful.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"Statful Client for Java\n==============\n\n[![Build Status](https://travis-ci.org/statful/statful-client-java.svg?branch=master)](https://travis-ci.org/statful/statful-client-java)\n\nStatful client for Java. This client is intended to gather metrics and send them to Statful.\n\n## Table of Contents\n\n* [Supported Versions of Java](#supported-versions-of-java)\n* [Configuration](#configuration)\n* [Quick Start](#quick-start)\n* [Custom Transport](#custom-transport)\n* [Examples](#examples)\n* [Reference](#reference)\n* [Authors](#authors)\n* [License](#license)\n\n## Supported Versions of Java\n\n| Statful client Version | Tested Java versions  |\n|:---|:---|\n| 2.x.x | `Java 8` |\n\n## Configuration\n\nAdd one of the following snippets to your POM.xml file.\n\n### Configuration for UDP client\n\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.statful.client\u003c/groupId\u003e\n        \u003cartifactId\u003eudp-client\u003c/artifactId\u003e\n        \u003cversion\u003e${statful-client.version}\u003c/version\u003e\n    \u003c/dependency\u003e\n\n### Configuration for HTTP client\n\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.statful.client\u003c/groupId\u003e\n        \u003cartifactId\u003ehttp-client\u003c/artifactId\u003e\n        \u003cversion\u003e${statful-client.version}\u003c/version\u003e\n    \u003c/dependency\u003e\n\n### Using AspectJ\n\n### Configuration\n\nConfigure your project to weave your application as you like but don't forget to include the following dependencies on your project:\n\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.statful.client\u003c/groupId\u003e\n        \u003cartifactId\u003easpects\u003c/artifactId\u003e\n        \u003cversion\u003e${statful-client.version}\u003c/version\u003e\n    \u003c/dependency\u003e\n\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.aspectj\u003c/groupId\u003e\n        \u003cartifactId\u003easpectjrt\u003c/artifactId\u003e\n        \u003cversion\u003e${aspectj.version}\u003c/version\u003e\n    \u003c/dependency\u003e\n\nThen, you must set `StatfulAspect` with your `StatfulClient` instance:\n\n    StatfulAspect statfulAspect = Aspects.aspectOf(StatfulAspect.class);\n    statfulAspect.setStatfulClient(statfulClient());\n\nYou must include the aspect on your AspectJ configuration:\n\n    \u003cweaver\u003e\n        \u003cinclude within=\"com.statful.client.aspects.*\"/\u003e\n    \u003c/weaver\u003e\n    \u003caspects\u003e\n        \u003caspect name=\"com.statful.client.aspects.StatfulAspect\"/\u003e\n    \u003c/aspects\u003e\n    \n### Annotation\n\nAfter configuring `StatfulAspect`, you can use `@Timer` to annotate your methods and measure the time of execution.\n\n```java\n@Timer(name = \"execution\", tags = {\"controller\", \"Entities\", \"method\", \"postEntity\"})\npublic Response\u003cStatus\u003e postEntity(Entity entity) {\n    // ...\n}\n```\n\nThe above example would send a metric named `application.timer.execution` with the configured tags and the default timer aggregations.\n\n## Quick start\n\nAfter declaring Statful Client as a dependency, you are ready to use it. The quickest way is to do the following:\n\n```java\n// Instantiates a new HTTP client and build the configuration fluently\nStatfulClient client = StatfulFactory.buildHTTPClient().with()\n        .token(\"STATFUL_API_TOKEN\")\n        .build();\n\n// Send a metric\nclient.counter(\"transactions\", 1).send();\n```\n\u003e **IMPORTANT:** This configuration uses the default **host** and **port**. You can learn more about configuration in [Reference](#reference).\n\n## Custom Transport\n\nYou can add support for your own custom transport, besides the currently supported HTTP and UDP. To adapt the client to your implementation, you must perform two steps:\n\n1. Implement the `TransportSender` interface, which defines a method to send metric using your own transport.\n2. Implement a client factory by extending the abstract class CustomStatfulFactory`.\n\nBy extending implementing `TransportSender buildTransportSender(final ClientConfiguration configuration)`, your custom TransportSender` implementation has access to all global client configuration, as well as the asynchronous sending of metrics, so you only need to worry about sending metrics.  \n\n### Custom Transport Example\n\nFirst implement the `TransportSender` interface, then you can implement your client factory similar to the following way:\n\n```java\npublic final class StatfulFactory {\n\n    private static final ThriftClientFactory THRIFT_CLIENT_FACTORY = new ThriftClientFactory();\n\n    private StatfulFactory() { }\n\n    public static StatfulClientBuilder buildThriftClient() {\n        // The client is built with default underlying mechanism used in HTTP and UDP transports, including asynchronous sending\n        return THRIFT_CLIENT_FACTORY.buildClient();\n    }\n\n    private static class ThriftClientFactory extends CustomStatfulFactory {\n        ThriftClientFactory() {\n            super(Transport.OTHER);\n        }\n\n        @Override\n        protected TransportSender buildTransportSender(final ClientConfiguration configuration) {\n            // Has access to global configuration\n            return new ThriftSender(configuration.getHost(), configuration.getPort());\n        }\n    }\n}\n```\n\nTo use your code, you need to include the following Statful dependency in your POM.xml file:\n\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.statful.client\u003c/groupId\u003e\n        \u003cartifactId\u003ecore\u003c/artifactId\u003e\n        \u003cversion\u003e${statful-client.version}\u003c/version\u003e\n    \u003c/dependency\u003e\n    \nAnd then, use your own implementation to send metrics:\n\n```java\nStatfulClient client = StatfulFactory.buildThriftClient().with()\n        .app(\"AccountService\")\n        .host(\"statful-relay.yourcompany.com\")\n        .tag(\"cluster\", \"production\")\n        .build();\n\nclient.gauge(\"testGauge\", 10).send();\n```\n\n### HTTP Authentication Token\n\nIf you implement HTTP-based transport, you need to send the `M-Api-Token` header with your token. You can access the token name inside your client factory using `ClientConfiguration.TOKEN_HEADER`.\n\n\n### Avoiding metrics back-pressure\n\nWhen the rate of metrics sent to the Statful client is too high, metrics start to be lost and warn log messages are printed. To help reduce this problem there are multiple configuration parameters that can be useful:\n\n- **timeout**: Reducing communication timeout, for when the network latency is too high, helps free busy workers sooner to handle other metrics in the buffer.\n- **workerPoolSize**: Increase the workers pool (default is 1). Note that each worker spawns a thread and, if too many workers are spawn, thread contention could start to be a problem.\n- **flushSize** and **flushInterval**: Increasing metrics flush size and interval helps reducing back-pressure but it'll have memory impact and and the payload size sent to Statful will be bigger.\n\n## Examples\n\nYou can find here some useful usage examples of the Statful Client. In the following examples is assumed you have already included Statful Client in your project.\n\n### UDP Configuration\n\nCreates a simple UDP configuration for the client.\n\n```java\nStatfulClient client = StatfulFactory.buildUDPClient().with()\n        .host(\"statful-relay.yourcompany.com\")\n        .app(\"AccountService\")\n        .tag(\"cluster\", \"production\")\n        .build();\n```\n\n### HTTP Configuration\n\nCreates a simple HTTP API configuration for the client.\n\n```java\nStatfulClient client = StatfulFactory.buildHTTPClient().with()\n        .app(\"AccountService\")\n        .token(\"STATFUL_API_TOKEN\")\n        .tag(\"cluster\", \"production\")\n        .build();\n```\n\n### Defaults Configuration Per Method\n\nCreates a configuration for the client with custom default options per method.\n\n```java\nStatfulClient client = StatfulFactory.buildHTTPClient().with()\n        .tag(\"cluster\", \"production\")\n        .token(\"STATFUL_API_TOKEN\")\n        .counter(agg(AVG)).counter(aggFreq(FREQ_180))\n        .gauge(agg(FIRST)).gauge(aggFreq(FREQ_180))\n        .timer(agg(COUNT)).timer(aggFreq(FREQ_180))\n        .timer(tag(\"cluster\", \"qa\"))\n        .build();\n```\n\n### Mixed Complete Configuration\n\nCreates a configuration defining a value for other available options.\n\n```java\nStatfulClient client = StatfulFactory.buildHTTPClient().with()\n        .token(\"STATFUL_API_TOKEN\")\n        .namespace(\"application\")\n        .isDryRun(true)\n        .flushInterval(5000)\n        .flushSize(50)\n        .timeoutMs(300)\n        .workerPoolSize(2)\n        .connectionTimeoutMs(300)\n        .connectionPoolSize(4)\n        .sampleRate(10)\n        .secure(false)\n        .build();\n```\n\n### Add metrics\n\nCreates a simple client configuration and use it to send some metrics.\n\n```java\nStatfulClient client = StatfulFactory.buildHTTPClient().with()\n        .app(\"AccountService\")\n        .token(\"TOKEN\")\n        .tag(\"cluster\", \"production\")\n        .build();\n\n// Send three different metrics (gauge, timer and a counter)\nclient.gauge(\"testGauge\", 10).send();\nclient.timer(\"testTimer\", 100).send();\nclient.counter(\"testTimer\", 1).send();\nclient.put(\"testCustomMetric\", 1).send();\n\n// Metric to be sent with tags\nclient.counter(\"testCounter\", 1).with()\n        .tag(\"host\", \"localhost\").tag(\"status\", \"SUCCESS\")\n        .send();\n```\n\n### Add aggregated metrics\n\nCreate a simple client configuration and use it to store previously aggregated metrics. \nThis is useful for existing collectors that expose metrics aggregated over periods of time.\n\n```java\nStatfulClient client = StatfulFactory.buildHTTPClient().with()\n        .app(\"AccountService\")\n        .token(\"TOKEN\")\n        .tag(\"cluster\", \"production\")\n        .build();\n\n// Send three different metrics (gauge, timer and a counter)\nclient.aggregatedGauge(\"testGauge\", 10, Aggregation.AVG, AggregationFreq.FREQ_120).send();\nclient.aggregatedTimer(\"testTimer\", 100, Aggregation.AVG, AggregationFreq.FREQ_10).send();\nclient.aggregatedCounter(\"testTimer\", 1, Aggregation.SUM, AggregationFreq.FREQ_10).send();\nclient.aggregatedPut(\"testCustomMetric\", Aggregation.COUNT, AggregationFreq.FREQ_180).send();\n\n// Metric to be sent with tags\nclient.aggregatedCounter(\"testCounter\", 1, Aggregation.SUM, AggregationFreq.FREQ_30).with()\n        .tag(\"host\", \"localhost\").tag(\"status\", \"SUCCESS\")\n        .send();\n```\n\n## Reference\n\nDetailed reference if you want to take full advantage from Statful.\n\n### Global configuration\n\nThe custom options that can be set on config param are detailed below.\n\n| Option | Description | Type | Default | Required |\n|:---|:---|:---|:---|:---|\n| _app_ | Defines the application global name. If specified sets a global tag `app=setValue`. | `String` | **none** | **NO** |\n| _dryRun_ | Defines if metrics should be output to the logger instead of being sent. Log level is _DEBUG_. | `boolean` | `false` | **NO** |\n| _flushInterval_ | Defines the periodicity of buffer flushes in **miliseconds**. | `int` | `3000` | **NO** |\n| _flushSize_ | Defines the maximum buffer size before performing a flush. | `int` | `1000` | **NO** |\n| _namespace_ | Defines the global namespace. | `String` | `application` | **NO** |\n| _sampleRate_ | Defines the rate sampling. **Should be a number between [1, 100]**. | `int` | `100` | **NO** |\n| _tags_ | Defines a list global tags. | `String`, `String` pairs | Empty list of tags | **NO** |\n| _host_ | Defines the host name to where the metrics should be sent. | `String` | `api.statful.com` | **NO** |\n| _port_ | Defines the port. | `int` | `443` | **NO** |\n| _token_ | Defines the authentication token to be used. | `String` | **none** | **NO** |\n| _timeout_ | Defines the timeout for the transport layers in **miliseconds**. Must be set inside _api_. | `long` | `2000` | **NO** |\n| _secure_ | Enable or disables HTTPS. | `boolean` | `true` | **NO** |\n| _connectTimeout_ | Connection timeout for http/tcp transports in **milliseconds**. | `long` | `500` | **NO** |\n| _connectionPoolSize_ | Connection pool size. | `int` | `10` | **NO** |\n| _workerPoolSize_ | Asynchronous workers pool size. | `int` | `1` | **NO** |\n\n### Methods\n\n```java\n// normal methods\nclient.counter(\"testCounter\", 1).with().aggregations(SUM).send();\nclient.gauge(\"testGauge\", 10).with().tag(\"host\", \"localhost\").send();\nclient.timer(\"testTimer\", 200).with().namespace(\"sandbox\").send();\nclient.metric(\"testCustomMetric\").with().namespace(\"my-namespace\").send();\nclient.counter(\"transactions\").with().tag(\"host\", \"localhost\").tag(\"status\", \"SUCCESS\").send();\nclient.counter(\"transactions\").with().aggregations(AVG, P90).aggFreq(FREQ_10).send();\n\n// aggregated methods\nclient.aggregatedGauge(\"testGauge\", 10, Aggregation.AVG, AggregationFreq.FREQ_120).send();\nclient.aggregatedTimer(\"testTimer\", 100, Aggregation.AVG, AggregationFreq.FREQ_10).send();\nclient.aggregatedCounter(\"testTimer\", 1, Aggregation.SUM, AggregationFreq.FREQ_10).send();\nclient.aggregatedPut(\"testCustomMetric\", Aggregation.COUNT, AggregationFreq.FREQ_180).send();\n```\n\nThe methods for sending metrics receive a metric name and a metric value as arguments and send a counter/gauge/timer/custom metric.\nRead the methods options reference bellow to get more information about the default values.\n\n| Option | Description | Default for Counter | Default for Gauge | Default for Timer | Default for Custom Metric |\n|:---|:---|:---|:---|:---|:---|\n| _aggregations_ | Defines the aggregations to be executed. These aggregations are merged with the ones configured globally, including method defaults.\u003cbr\u003e\u003cbr\u003e **Valid Aggregations:** `AVG, COUNT, SUM, FIRST, LAST, P90, P95, P99 MIN, MAX` | `SUM, COUNT` | `LAST` | `AVG, P90, COUNT` | none |\n| _aggFreq_ | Defines the aggregation frequency in **seconds**. It overrides the global aggregation frequency configuration.\u003cbr\u003e\u003cbr\u003e **Valid Aggregation Frequencies:** `10, 30, 60, 120, 180, 300` | `10` | `10` | `10` | `10` |\n| _namespace_ | Defines the namespace of the metric. It overrides the global namespace configuration. | `application` | `application` | `application` | `application` |\n| _tags_ | Defines the tags of the metric. These tags are merged with the ones configured globally, including method defaults. | none | none | ` unit: 'ms'` | none |\n| _timestamp_ | Defines the timestamp of the metric. This timestamp is a **POSIX/Epoch** time in **seconds**. | `current timestamp` | `current timestamp` | `current timestamp` | `current timestamp` |\n\n\u003e Note that calling the `aggregations` method on the `aggregatedX` methods will throw `UnsupportedOperationException`.\n\n### Enabling/disabling Statful\n\n```java\n// The following metric will be sent to Statful\nstatful.enable();\nstatful.counter(\"transactions\").send();\n\n// The following metric will NOT be sent to Statful\nstatful.disable();\nstatful.counter(\"transactions\").send();\n```\n\n## Authors\n\n[Mindera - Software Craft](https://github.com/Mindera)\n\n## License\n\nStatful Java Client is available under the MIT license. See the [LICENSE](https://raw.githubusercontent.com/statful/statful-client-objc/master/LICENSE) file for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstatful%2Fstatful-client-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstatful%2Fstatful-client-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstatful%2Fstatful-client-java/lists"}