{"id":18907254,"url":"https://github.com/wurfl/logstash-filter-wurfl_device_detection","last_synced_at":"2026-02-11T07:02:04.287Z","repository":{"id":82041446,"uuid":"248298448","full_name":"WURFL/logstash-filter-wurfl_device_detection","owner":"WURFL","description":"Java plugin for Logstash that enriches a stream of data with device detection data obtained from WURFL","archived":false,"fork":false,"pushed_at":"2020-09-28T14:22:12.000Z","size":115,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-09T11:04:20.380Z","etag":null,"topics":["java-plugin","logstash","logstash-filter","logstash-plugin","wurfl","wurfl-microservice"],"latest_commit_sha":null,"homepage":"","language":"Java","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/WURFL.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2020-03-18T17:28:28.000Z","updated_at":"2021-06-24T11:57:48.000Z","dependencies_parsed_at":"2023-04-10T00:19:41.015Z","dependency_job_id":null,"html_url":"https://github.com/WURFL/logstash-filter-wurfl_device_detection","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/WURFL/logstash-filter-wurfl_device_detection","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WURFL%2Flogstash-filter-wurfl_device_detection","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WURFL%2Flogstash-filter-wurfl_device_detection/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WURFL%2Flogstash-filter-wurfl_device_detection/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WURFL%2Flogstash-filter-wurfl_device_detection/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WURFL","download_url":"https://codeload.github.com/WURFL/logstash-filter-wurfl_device_detection/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WURFL%2Flogstash-filter-wurfl_device_detection/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29329492,"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":["java-plugin","logstash","logstash-filter","logstash-plugin","wurfl","wurfl-microservice"],"created_at":"2024-11-08T09:20:23.039Z","updated_at":"2026-02-11T07:02:04.257Z","avatar_url":"https://github.com/WURFL.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"### WURFL Logstash plugin\n\nThis project contains a java plugin for Logstash that enriches a stream of data with device data obtained from WURFL ([through WURFL Microservice Client, as deployed in one of multiple ways](https://www.scientiamobile.com/products/wurfl-microservice/)).\n\nThis plugin requires Java 8+, Gradle 5.x or above and has been tested with Logstash 8.0.0 and 7.6.x\nIt also requires a running instance of WURFL Microservice server, available on [AWS](https://aws.amazon.com/marketplace/search/results?x=26\u0026y=17\u0026searchTerms=WURFL), [Azure](https://azuremarketplace.microsoft.com/en-us/marketplace/apps?search=WURFL\u0026page=1) or as a [Docker container](https://www.scientiamobile.com/products/wurfl-microservice-docker-detect-device/)\n\n## Compile the project\n\nFrom the root of the project enter ` ./gradlew gem`\n\nThe compiler will create a file `logstash-filter-logstash_filter_wurfl_device_detection-x.y.z.gem`, where x.y.z version number\nis the one defined in the `VERSION` file.\n\n## Install the plugin on logstash\n\n  From the logstash installation `bin` directory execute\n  `./logstash-plugin install --local \u003cplugin_project_home\u003e/logstash-filter-logstash_filter_wurfl_device_detection-x.y.z.gem`\n  \n  You can find a sample configuration for this plugin under `sample_config/wurfl_filter_config_with_http_input`; you will want to create your own\n  production configuration file using input and output plugins of your choice.\n  \n### Example configuration - using HTTP input plugin to receive HTTP request data\nScenario: we configure logstash to receive HTTP request information that we want to enrich with WURFL data.\n\n```\ninput {\n  http {\n    host =\u003e \"0.0.0.0\"\n    port =\u003e \"19080\"\n  }\n}\nfilter {\n  logstash_filter_wurfl_device_detection {\n    source =\u003e \"headers\"\n    cache_size =\u003e 300000\n    inject_wurfl_id =\u003e true\n    inject_wurfl_info =\u003e false\n    inject_wurfl_api_version =\u003e false\n    scheme =\u003e \"http\"\n    host =\u003e \"localhost\"\n    port =\u003e \"8080\"\n  }\n}\noutput {\n  stdout { codec =\u003e rubydebug }\n}\n```\n\nThe http input plugin receives an http request to the specified host and port, with a payload map that contains the HTTP headers that the WURFL plugin will analyze.\nNote that the `source` name is `headers`. Also note that you can configure the logstash input as you want,\nbut if you want the WURFL plugin to work with headers, you must configure it so that it uses an header map.\n\n### Example configuration - using JSON input and filter plugins to receive HTTP request data\nScenario: we configure logstash to receive HTTP request information from one or more JSON files (needs logstash-filter-json plugin).\n\n```\ninput {\n  file {\n    type =\u003e \"json\"\n    path =\u003e \"\u003cpath to\u003e/logstash-filter-wurfl/sample_input/kafka_events_mini.json\"\n    start_position =\u003e \"beginning\"\n  }\n}\nfilter {\n    json {\n    source =\u003e \"message\"\n}\n}\nfilter {\n  wurfl_device_detection {\n    source =\u003e \"message\"\n    cache_size =\u003e 300000\n    inject_wurfl_id =\u003e true\n    inject_wurfl_info =\u003e false\n    inject_wurfl_api_version =\u003e false\n    # commenting the capabilities config, you get them all\n    #static_capabilities =\u003e [\"model_name\", \"brand_name\"]\n    #virtual_capabilities =\u003e [\"form_factor\"]\n    scheme =\u003e \"http\"\n    host =\u003e \"localhost\"\n    port =\u003e \"8080\"\n  }\n}\noutput {\n  # you may choose whatever output you want\n  stdout { codec =\u003e rubydebug }\n}\n```\n\nSource field \"message\" is the root element of the json file\n\n### Starting logstash\n\nStart the WURFL Microservice server on AWS/Azure/Docker then, let's run logstash:\n\n`./logstash -f \u003cpath_to_configuration\u003e.conf\u003e`\n\nin case you choose the HTTP input configuration, sending a HTTP request to its configured port (in this case 19080) like this (we just add the user-agent header for simplicity, but you can send all headers using the -H flag):\n\n`curl -H \"User-Agent: Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3359.139 Mobile Safari/537.36\" http://localhost:19080`\n\nwe'll get an output that looks like this:\n  \n  ```\n{\n       \"message\" =\u003e \"\",\n      \"@version\" =\u003e \"1\",\n       \"headers\" =\u003e {\n         \"request_method\" =\u003e \"GET\",\n              \"http_host\" =\u003e \"localhost:19080\",\n            \"http_accept\" =\u003e \"*/*\",\n        \"http_user_agent\" =\u003e \"Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3359.139 Mobile Safari/537.36\",\n         \"content_length\" =\u003e \"0\",\n           \"request_path\" =\u003e \"/\",\n           \"http_version\" =\u003e \"HTTP/1.1\"\n    },\n    \"@timestamp\" =\u003e 2020-03-19T09:01:58.761Z,\n          \"host\" =\u003e \"127.0.0.1\",\n         \"wurfl\" =\u003e {\n                            \"is_robot\" =\u003e \"false\",\n                              \"is_ios\" =\u003e \"false\",\n                  \"advertised_browser\" =\u003e \"Chrome Mobile\",\n                         \"form_factor\" =\u003e \"Smartphone\",\n                      \"is_app_webview\" =\u003e \"false\",\n                           \"is_mobile\" =\u003e \"true\",\n                          \"is_android\" =\u003e \"true\",\n                          \"brand_name\" =\u003e \"Google\",\n                   \"resolution_height\" =\u003e \"2560\",\n                    \"is_windows_phone\" =\u003e \"false\",\n                            \"wurfl_id\" =\u003e \"google_pixel_2_xl_ver1\",\n                              \"is_app\" =\u003e \"false\",\n                \"complete_device_name\" =\u003e \"Google Pixel 2 XL\",\n                     \"pointing_method\" =\u003e \"touchscreen\",\n                           \"device_os\" =\u003e \"Android\",\n                 \"advertised_app_name\" =\u003e \"Chrome browser\",\n                         \"device_name\" =\u003e \"Google Pixel 2 XL\",\n                    \"resolution_width\" =\u003e \"1440\",\n        \"advertised_device_os_version\" =\u003e \"8.0.0\",\n                           \"is_tablet\" =\u003e \"false\",\n                          \"model_name\" =\u003e \"Pixel 2 XL\",\n                      \"mobile_browser\" =\u003e \"Chrome Mobile\",\n                          \"is_smarttv\" =\u003e \"false\",\n                      \"is_touchscreen\" =\u003e \"true\",\n          \"advertised_browser_version\" =\u003e \"65.0.3359.139\",\n                       \"is_smartphone\" =\u003e \"true\",\n                \"advertised_device_os\" =\u003e \"Android\",\n        [...]\n    }\n}\n\n```\n\nLogstash will automatically parse the JSON input file configuration and print out the following.\n\n- `stdin` and `stdout` define which input and output plugin will be used:  in our scenario\n we use the HTTP input plugin, while we use the ruby debug console as output.\n- `cache_size` (integer) is the size of the WURFL Microservice client cache. Defaults to 100000\n- `inject_wurfl_id` defines whether `wurfl_id` will be added to enriched output (defaults to true)\n- `inject_wurfl_info` defines whether `wurfl_info` will be added to enriched output (defaults to false)\n- `inject_wurfl_api_version` defines whether `wurfl_api_version` will be added to enriched output (defaults to false)\n- `static_capabilities` defines the list of static capabilities that you want to add to the enriched output (defaults to all)\n- `virtual_capabilities` defines the list of virtual capabilities that you want to add to the enriched output (defaults to all)\n- `scheme` defines the connection scheme to use to connect to WURFL Microservice server (currently only HTTP is supported)\n- `host` host/ip address of the WURFL Microservice server (defaults to localhost)\n- `port` port of the WURFL Microservice server (defaults to 80)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwurfl%2Flogstash-filter-wurfl_device_detection","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwurfl%2Flogstash-filter-wurfl_device_detection","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwurfl%2Flogstash-filter-wurfl_device_detection/lists"}