{"id":37030309,"url":"https://github.com/debugrammer/graylog-sdk-spring-boot","last_synced_at":"2026-01-14T03:41:37.263Z","repository":{"id":57728807,"uuid":"222863136","full_name":"debugrammer/graylog-sdk-spring-boot","owner":"debugrammer","description":"Graylog REST API SDK Spring Boot Starter","archived":false,"fork":false,"pushed_at":"2024-07-30T02:34:39.000Z","size":432,"stargazers_count":7,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-07-30T08:49:15.232Z","etag":null,"topics":["graylog","graylog-api","graylog-rest-api","graylog-sdk","java","sdk","spring-boot","spring-boot-starter"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/debugrammer.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-20T06:05:14.000Z","updated_at":"2024-07-30T02:34:42.000Z","dependencies_parsed_at":"2024-07-29T08:55:52.243Z","dependency_job_id":null,"html_url":"https://github.com/debugrammer/graylog-sdk-spring-boot","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/debugrammer/graylog-sdk-spring-boot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/debugrammer%2Fgraylog-sdk-spring-boot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/debugrammer%2Fgraylog-sdk-spring-boot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/debugrammer%2Fgraylog-sdk-spring-boot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/debugrammer%2Fgraylog-sdk-spring-boot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/debugrammer","download_url":"https://codeload.github.com/debugrammer/graylog-sdk-spring-boot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/debugrammer%2Fgraylog-sdk-spring-boot/sbom","scorecard":{"id":331262,"data":{"date":"2025-08-11","repo":{"name":"github.com/debugrammer/graylog-sdk-spring-boot","commit":"9bc2dcb57f28f2aac061d88aff6e9a7799ff0565"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/29 approved changesets -- score normalized to 0","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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.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":"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":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"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":"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/build.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/debugrammer/graylog-sdk-spring-boot/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/debugrammer/graylog-sdk-spring-boot/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/debugrammer/graylog-sdk-spring-boot/build.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction 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":"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":"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":"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"}},{"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: MIT License: 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":-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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'","Warn: branch protection not enabled for branch '2.x'"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 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"}}]},"last_synced_at":"2025-08-18T03:41:47.099Z","repository_id":57728807,"created_at":"2025-08-18T03:41:47.099Z","updated_at":"2025-08-18T03:41:47.099Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408856,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"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":["graylog","graylog-api","graylog-rest-api","graylog-sdk","java","sdk","spring-boot","spring-boot-starter"],"created_at":"2026-01-14T03:41:36.644Z","updated_at":"2026-01-14T03:41:37.254Z","avatar_url":"https://github.com/debugrammer.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Graylog SDK Spring Boot Starter\n\u003e Graylog SDK Spring Boot Starter to communicate with the [Graylog REST API](https://docs.graylog.org/en/latest/pages/configuration/rest_api.html)\n\n![build](https://github.com/debugrammer/graylog-sdk-spring-boot/actions/workflows/build.yml/badge.svg)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.joonsang.graylog/graylog-sdk-spring-boot-starter/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.joonsang.graylog/graylog-sdk-spring-boot-starter)\n[![javadoc](https://javadoc.io/badge2/com.joonsang.graylog/graylog-sdk-spring-boot-starter/javadoc.svg)](https://javadoc.io/doc/com.joonsang.graylog/graylog-sdk-spring-boot-starter)\n\n## Getting Started\nGraylog SDK Spring Boot Starter is available at the Central Maven Repository.\n\n**Maven**\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.joonsang.graylog\u003c/groupId\u003e\n  \u003cartifactId\u003egraylog-sdk-spring-boot-starter\u003c/artifactId\u003e\n  \u003cversion\u003e2.0.5\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n**Gradle**\n```\nimplementation group: 'com.joonsang.graylog', name: 'graylog-sdk-spring-boot-starter', version: '2.0.5'\n```\n\n## Troubleshooting\n* Exception occurred: `java.lang.NoSuchMethodError: 'okhttp3.RequestBody okhttp3.RequestBody.create(java.lang.String, okhttp3.MediaType)'`\n  * There is an OkHttp3 version under 4.x somewhere in your project dependencies.\n  * Add OkHttp3 4.x in your dependency like below.\n    * `implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.x.x'`\n  * https://github.com/debugrammer/graylog-sdk-spring-boot/issues/3\n\n## Graylog API Credentials\nFirst create user access token on your Graylog web interface for accessing Graylog APIs.\n\nRefer Graylog documentation: [Creating and using Access Token](https://docs.graylog.org/en/latest/pages/configuration/rest_api.html#creating-and-using-access-token)\n\n## Graylog 3.2 Search\n### Usage\nConfigure environment variables for Graylog SDK with `application.properties`:\n```\n# Graylog API Settings\ngraylog.sdk.api.scheme=http\ngraylog.sdk.api.host=localhost\ngraylog.sdk.api.port=9000\ngraylog.sdk.api.credentials=base64({graylog_access_token}:token)\ngraylog.sdk.api.timeout=60000\n```\n\nor `application.yml`:\n```\n# Graylog API Settings\ngraylog:\n  sdk:\n    api:\n      scheme: http\n      host: localhost\n      port: 9000\n      credentials: base64({graylog_access_token}:token)\n      timeout: 60000\n```\n\nThen inject `GraylogSearch` bean in your project:\n```\nprivate final GraylogSearch graylogSearch;\n\npublic YourClassName(GraylogSearch graylogSearch) {\n    this.graylogSearch = graylogSearch;\n}\n```\n\n### Request Graylog REST APIs\n\n### 1. Search\n\n#### 1.1. Messages\nMessage search with time range.\n\nCreate POJO class specifying your Graylog message fields.\n```\npublic class YourMessageObject {\n\n    private String message;\n    \n    private String source;\n\n    private String timestamp;\n\n    // getters and setters\n}\n```\n\nGraylog SDK will return the list of message object as you specified.\n```\nString from = \"2020-07-30T00:00:00Z\";\nString to = \"2020-07-31T00:00:00Z\";\n\nTimerange timerange = Timerange.builder()\n    .type(TimeRangeType.absolute)\n    .from(from)\n    .to(to)\n    .build();\n\nSortConfig sort = SortConfig.builder()\n    .field(\"timestamp\")\n    .order(SortConfigOrder.DESC)\n    .build();\n\nint pageSize = 20;\nint pageNo = 1;\n\n@SuppressWarnings(\"unchecked\")\nPage\u003cYourMessageObject\u003e messages = (Page\u003cYourMessageObject\u003e) graylogSearch.getMessages(\n    List.of(\"graylog_stream_id\"),\n    timerange,\n    \"source:example.org\",\n    pageSize,\n    pageNo,\n    sort,\n    YourMessageObject.class\n);\n```\n\n#### 1.2. Statistics\nStatistics for a query using a time range.\n```\nString from = \"2020-07-30T00:00:00Z\";\nString to = \"2020-07-31T00:00:00Z\";\n\nTimerange timerange = Timerange.builder()\n    .type(TimeRangeType.absolute)\n    .from(from)\n    .to(to)\n    .build();\n\nList\u003cSeries\u003e seriesList = List.of(\n    Series.builder().type(SeriesType.avg).field(\"process_time\").build(),\n    Series.builder().type(SeriesType.count).field(\"process_time\").build(),\n    Series.builder().type(SeriesType.min).field(\"process_time\").build(),\n    Series.builder().type(SeriesType.max).field(\"process_time\").build(),\n    Series.builder().type(SeriesType.percentile).percentile(95.0f).field(\"process_time\").build(),\n    Series.builder().type(SeriesType.percentile).percentile(99.0f).field(\"process_time\").build(),\n    Series.builder().type(SeriesType.count).build()\n);\n\nList\u003cStatistics\u003e statistics = graylogSearch.getStatistics(\n    List.of(\"graylog_stream_id\"),\n    timerange,\n    \"source:example.org\",\n    seriesList\n);\n```\n\n#### 1.3. Histogram\nDatetime histogram of a query using a time range.\n```\nString from = \"2020-07-30T00:00:00Z\";\nString to = \"2020-07-31T00:00:00Z\";\n\nTimerange timerange = Timerange.builder()\n    .type(TimeRangeType.absolute)\n    .from(from)\n    .to(to)\n    .build();\n\nInterval interval = Interval.builder()\n    .type(IntervalType.timeunit)\n    .timeunit(IntervalTimeunit.get(IntervalTimeunit.Unit.minutes, 1))\n    .build();\n\nList\u003cSeries\u003e seriesList = List.of(\n    Series.builder().type(SeriesType.count).build(),\n    Series.builder().type(SeriesType.avg).field(\"process_time\").build()\n);\n\nList\u003cSearchTypePivot\u003e columnGroups = List.of(\n    SearchTypePivot.builder().type(SearchTypePivotType.values).field(\"field_name\").limit(5).build()\n);\n\nHistogram histogram = graylogSearch.getHistogram(\n    List.of(\"graylog_stream_id\"),\n    timerange,\n    interval,\n    \"source:example.org\",\n    seriesList,\n    columnGroups\n);\n```\n\n#### 1.4. Terms\n\u003e Differences between Quick Values and Graylog 3.2 Data Table\n\u003e * Stacking fields on Legacy Terms (`Quick Values`) means intersecting `stacked fields` by `field` like an INTERSECTION\n\u003e * Adding fields on row groups of Terms (`Data Table`) means combining `fields` by order, like a UNION\n\nMost common field terms of a query using a time range.\n```\nString from = \"2020-07-30T00:00:00Z\";\nString to = \"2020-07-31T00:00:00Z\";\n\nTimerange timerange = Timerange.builder()\n    .type(TimeRangeType.absolute)\n    .from(from)\n    .to(to)\n    .build();\n\nList\u003cSeries\u003e seriesList = List.of(\n    Series.builder().type(SeriesType.count).build()\n);\n\nList\u003cSearchTypePivot\u003e rowGroups = List.of(\n    SearchTypePivot.builder().type(SearchTypePivotType.values).field(\"field_name_1\").limit(10).build(),\n    SearchTypePivot.builder().type(SearchTypePivotType.values).field(\"field_name_2\").build()\n);\n\nList\u003cSearchTypePivot\u003e columnGroups = List.of(\n    SearchTypePivot.builder().type(SearchTypePivotType.values).field(\"field_name_3\").limit(5).build()\n);\n\nSortConfig sort = SortConfig.builder()\n    .type(SortConfigType.series)\n    .field(\"count()\")\n    .direction(SortConfigDirection.Descending)\n    .build();\n\ngraylogSearch.getTerms(\n    List.of(\"graylog_stream_id\"),\n    timerange,\n    \"source:example.org\",\n    seriesList,\n    rowGroups,\n    columnGroups,\n    sort\n);\n```\n\n#### 1.5. Raw\nSearch with a search spec builder, returns raw response message from Graylog.\n```\nSearchSpec searchSpec = SearchSpec.builder()\n    .query(\n        Query.builder()\n            .filter(\n                Filter.builder()\n                    .filters(\n                        List.of(\n                            SearchFilter.builder()\n                                .id(\"graylog_stream_id\")\n                                .build()\n                        )\n                    )\n                    .build()\n            )\n            .query(\n                SearchQuery.builder()\n                    .queryString(\"source:example.org\")\n                    .build()\n            )\n            .timerange(\n                Timerange.builder()\n                    .type(TimeRangeType.relative)\n                    .range(300)\n                    .build()\n            )\n            .searchType(\n                SearchType.builder()\n                    .name(\"chart\")\n                    .series(\n                        List.of(\n                            Series.builder()\n                                .type(SeriesType.count)\n                                .build()\n                        )\n                    )\n                    .rollup(true)\n                    .rowGroups(\n                        List.of(\n                            SearchTypePivot.builder()\n                                .type(SearchTypePivotType.values)\n                                .field(\"source\")\n                                .limit(5)\n                                .build()\n                        )\n                    )\n                    .columnGroups(List.of())\n                    .sort(List.of())\n                    .type(SearchTypeType.pivot)\n                    .build()\n            )\n            .build()\n    )\n    .build();\n\nString result = graylogSearch.raw(searchSpec);\n```\n\n### Graylog 3.2 Search Spec Builder\n\n### 1. Outline of Search Spec\n\u003e With a search spec builder, it will generate required IDs automatically if not specified\n* Each search has a search ID, which is made of [Object ID](https://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html).\n* Each query has a query ID, which is made of [UUID](https://docs.mongodb.com/manual/reference/method/UUID/).\n* Each search type has a search type ID, which is made of [UUID](https://docs.mongodb.com/manual/reference/method/UUID/).\n```\nSearchSpec.builder() /* search ID */\n    .query(\n        Query.builder() /* query ID */\n            .filter(... your filter ...)\n            .query(... your search query ...)\n            .timerange(... your timerange ...)\n            .searchType( /* search type ID */\n                ... your search type ...\n            )\n            .build()\n    )\n    .parameter(... your parameter if needed ...)\n    .build();\n```\n\n### 2. Search Specifications\n\n#### 2.1. Search Spec\n\u003e Data implementation of Graylog search UI as below\n\n![Graylog Search UI](https://github.com/debugrammer/graylog-sdk-spring-boot/blob/2.x/images/graylog_search_ui.jpg)\n\nSearch spec contains search ID, queries, and parameters.\n\nGenerate search spec with specific search ID:\n```\nSearchSpec.builder()\n    .id(\"your object id\")\n    ...\n    .build();\n```\n\nGenerate search spec with new search ID:\n```\nSearchSpec.builder()\n    ...\n    .build();\n```\n\n#### 2.2. Query\nQuery contains query ID, filter, search query, time range, and search types.\n\nGenerate query with specific query ID:\n```\nQuery.builder()\n    .id(\"your uuid\")\n    ...\n    .build();\n```\n\nGenerate query with new query ID:\n```\nQuery.builder()\n    ...\n    .build();\n```\n\n#### 2.3. Filter\nGraylog search filter. Equivalent to `stream select` on [Graylog search UI](#21-search-spec).\n```\nFilter.builder()\n    .filters(\n        List.of(\n            SearchFilter.builder()\n                .id(\"your graylog stream id\")\n                .build()\n        )\n    )\n    .build();\n```\n\n#### 2.4. Timerange\nTime range of search. Equivalent to `time range select` on [Graylog search UI](#21-search-spec).\n\nRelative time range:\n```\nTimerange.builder()\n    .type(TimeRangeType.relative)\n    .range(300)\n    .build();\n```\n\nAbsolute time range:\n\u003e Requires [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format\n```\nTimerange timerange = Timerange.builder()\n    .type(TimeRangeType.absolute)\n    .from(\"2020-07-30T00:00:00Z\")\n    .to(\"2020-07-31T00:00:00Z\")\n    .build();\n```\n\nKeyword time range:\n```\nTimerange timerange = Timerange.builder()\n    .type(TimeRangeType.keyword)\n    .keyword(\"Last five minutes\")\n    .build();\n```\n\n#### 2.5. Search Query\nGraylog search query. Equivalent to `search query text field` on [Graylog search UI](#21-search-spec).\n```\nSearchQuery.builder()\n    .queryString(\"your graylog search query\")\n    .build();\n```\n\n#### 2.6. Search Type\n\u003e Data implementation of Graylog widget aggregation UI as below\n\n![Graylog Widget Aggregation UI](https://github.com/debugrammer/graylog-sdk-spring-boot/blob/2.x/images/graylog_widget_aggregation_ui.jpg)\n\nGenerate query with specific search type ID:\n```\nSearchType.builder()\n    .id(\"your uuid\")\n    ...\n    .build();\n```\n\nGenerate query with new search type ID:\n```\nSearchType.builder()\n    ...\n    .build();\n```\n\nFull sample:\n```\nSearchType.builder()\n    .name(\"chart\") /* name of search type */\n    .series( /* metrics */\n        List.of(\n            Series.builder()\n                .type(SeriesType.count)\n                .build()\n        )\n    )\n    .rollup(true)\n    .rowGroups( /* rows */\n        List.of(\n            SearchTypePivot.builder()\n                .type(SearchTypePivotType.values)\n                .field(\"source\")\n                .limit(15)\n                .build()\n        )\n    )\n    .columnGroups(List.of()) /* columns */\n    .sort(List.of()) /* sorting */\n    .type(SearchTypeType.pivot) /* pivot or messages */\n    .build()\n```\n\n#### 2.6.1. Series\nEquivalent to `METRICS` on [Graylog widget aggregation UI](#26-search-type).\n\ncount():\n```\nSeries.builder()\n    .type(SeriesType.count)\n    .build();\n```\n\navg(field_name):\n```\nSeries.builder()\n    .type(SeriesType.avg)\n    .field(\"process_time\")\n    .build();\n```\n\npercentile(field_name, 95):\n```\nSeries.builder()\n    .type(SeriesType.percentile)\n    .percentile(95.0f)\n    .field(\"process_time\")\n    .build();\n```\n\n#### 2.6.2. Row Groups\nEquivalent to `ROWS` on [Graylog widget aggregation UI](#26-search-type).\n```\nSearchTypePivot.builder()\n    .type(SearchTypePivotType.values) /* values or time */\n    .field(\"source\")\n    .limit(15)\n    .build()\n```\n\n#### 2.6.3. Column Groups\nEquivalent to `COLUMNS` on [Graylog widget aggregation UI](#26-search-type).\n```\nSearchTypePivot.builder()\n    .type(SearchTypePivotType.values) /* values or time */\n    .field(\"source\")\n    .limit(15)\n    .build()\n```\n\n#### 2.6.4. Sort\nEquivalent to `SORTING` and `DIRECTION` on [Graylog widget aggregation UI](#26-search-type).\n\nmessage sort:\n```\nSortConfig.builder()\n    .field(\"timestamp\")\n    .order(SortConfigOrder.DESC)\n    .build();\n```\n\npivot sort:\n```\nSortConfig.builder()\n    .type(SortConfigType.series)\n    .field(\"count()\")\n    .order(SortConfigDirection.Descending)\n    .build();\n```\n\n## Legacy Graylog Search \n\u003e Legacy search APIs will be no longer available from [Graylog 4.0](https://docs.graylog.org/en/3.3/pages/upgrade/graylog-3.3.html)\n\n### Usage\nConfigure environment variables for Graylog SDK with `application.properties`:\n```\n# Graylog API Settings\ngraylog.sdk.api.scheme=http\ngraylog.sdk.api.host=localhost\ngraylog.sdk.api.port=9000\ngraylog.sdk.api.credentials=base64({graylog_access_token}:token)\ngraylog.sdk.legacy.timezone=US/Eastern\n```\n\nor `application.yml`:\n```\n# Graylog API Settings\ngraylog:\n  sdk:\n    api:\n      scheme: http\n      host: localhost\n      port: 9000\n      credentials: base64({graylog_access_token}:token)\n    legacy:\n      timezone: US/Eastern\n```\n\nThen inject `LegacyGraylogSearch` bean in your project:\n```\nprivate final LegacyGraylogSearch legacyGraylogSearch;\n\npublic YourClassName(LegacyGraylogSearch legacyGraylogSearch) {\n    this.legacyGraylogSearch = legacyGraylogSearch;\n}\n```\n\n### Request Graylog REST APIs\n\u003e Old APIs in `Search` section were moved to `Legacy/Search` section from [Graylog 3.2](https://www.graylog.org/post/announcing-graylog-3-2)\n\nCurrently, only `Legacy/Search/Absolute` APIs are supported.\n\n### 1. Legacy Search Absolute\n\n#### 1.1. Messages\nMessage search with absolute time range.\n\nCreate POJO class specifying your Graylog message fields.\n```\npublic class YourMessageObject {\n\n    private String message;\n    \n    private String source;\n\n    private String timestamp;\n\n    // getters and setters\n}\n```\n\nGraylog SDK will return the list of message object as you specified.\n```\nLocalDateTime from = LocalDateTime.parse(\"2019-11-04 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\nLocalDateTime to = LocalDateTime.parse(\"2019-11-05 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\n\n@SuppressWarnings(\"unchecked\")\nList\u003cYourMessageObject\u003e messages = (List\u003cYourMessageObject\u003e) legacyGraylogSearch.getMessages(\n    \"graylog_stream_id\",\n    from,\n    to,\n    \"request_id:AQZ4mfVGVqWKD38XZU7aVG\",\n    YourMessageObject.class\n);\n```\n\nIf you need messages with paging, try like below.\n```\nLocalDateTime from = LocalDateTime.parse(\"2019-11-04 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\nLocalDateTime to = LocalDateTime.parse(\"2019-11-05 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\nint pageSize = 20;\nint pageNo = 1;\n\n@SuppressWarnings(\"unchecked\")\nPage\u003cYourMessageObject\u003e pagedMessages = (Page\u003cYourMessageObject\u003e) legacyGraylogSearch.getMessages(\n    \"graylog_stream_id\",\n    from,\n    to,\n    \"request_id:AQZ4mfVGVqWKD38XZU7aVG\",\n    pageSize,\n    pageNo,\n    YourMessageObject.class\n);\n```\n\n#### 1.2. Statistics\nField statistics for a query using an absolute time range.\n```\nLocalDateTime from = LocalDateTime.parse(\"2019-11-04 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\nLocalDateTime to = LocalDateTime.parse(\"2019-11-05 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\n\nStatistics statistics = legacyGraylogSearch.getStatistics(\n    \"graylog_stream_id\",\n    \"field_name\",\n    from,\n    to,\n    \"process_time:[0 TO 500]\"\n);\n```\n\n#### 1.3. Histogram\nDatetime histogram of a query using an absolute time range.\n```\nLocalDateTime from = LocalDateTime.parse(\"2019-11-04 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\nLocalDateTime to = LocalDateTime.parse(\"2019-11-05 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\n\nHistogram histogram = legacyGraylogSearch.getHistogram(\n    \"graylog_stream_id\",\n    TimeUnit.HOUR,\n    from,\n    to,\n    \"process_time:[0 TO 500]\"\n);\n```\n\n#### 1.4. Field Histogram\nField value histogram of a query using an absolute time range.\n```\nLocalDateTime from = LocalDateTime.parse(\"2019-11-04 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\nLocalDateTime to = LocalDateTime.parse(\"2019-11-05 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\n\nFieldHistogram fieldHistogram = legacyGraylogSearch.getFieldHistogram(\n    \"graylog_stream_id\",\n    \"field_name\",\n    TimeUnit.HOUR,\n    from,\n    to,\n    \"source:example.org\"\n);\n```\n\n#### 1.5. Terms\nMost common field terms of a query using an absolute time range.\n```\nLocalDateTime from = LocalDateTime.parse(\"2019-11-04 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\nLocalDateTime to = LocalDateTime.parse(\"2019-11-05 00:00:00\", DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\n\nTerms terms = legacyGraylogSearch.getTerms(\n    \"graylog_stream_id\",\n    \"field_name\",\n    \"field_name_to_stack\",\n    5,\n    from,\n    to,\n    false,\n    false,\n    \"source:example.org\"\n);\n```\n\n## Code Examples\n* [graylog-sdk-spring-boot-samples](https://github.com/debugrammer/graylog-sdk-spring-boot/tree/master/graylog-sdk-spring-boot-samples) in this repository contains the project that show you sample API implementations using Graylog SDK with Spring Boot.\n    * Check out [Graylog Query Builder](https://github.com/debugrammer/graylog-query-builder) if you are looking for query builder for [Graylog Search Query](https://docs.graylog.org/en/latest/pages/searching/query_language.html).\n\n## Migration Guide From 1.2.x\nYou'll find a guide to upgrade from 1.2.x to 2.x [here](https://github.com/debugrammer/graylog-sdk-spring-boot/releases/tag/2.0.0).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdebugrammer%2Fgraylog-sdk-spring-boot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdebugrammer%2Fgraylog-sdk-spring-boot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdebugrammer%2Fgraylog-sdk-spring-boot/lists"}