defmodule OffBroadway.Splunk.Options do @moduledoc """ OffBroadway Splunk option definitions and custom validators. """ def definition do [ sid: [ required: true, type: { :custom, __MODULE__, :type_non_empty_string, [[{:name, :sid}]] }, doc: """ The SID (Search ID) for the Splunk job we want to consume events from. """ ], receive_interval: [ type: :non_neg_integer, doc: """ The duration (in milliseconds) for which the producer waits before making a request for more messages. """, default: 5000 ], shutdown_timeout: [ type: :timeout, doc: """ The duration (in milliseconds) Broadway should wait before timing out when trying to stop the pipeline. """, default: :infinity ], on_success: [ type: :atom, doc: """ Configures the acking behaviour for successful messages. See the "Acknowledgements" section below for all the possible values. """, default: :ack ], on_failure: [ type: :atom, doc: """ Configures the acking behaviour for failed messages. See the "Acknowledgements" section below for all the possible values. """, default: :noop ], splunk_client: [ doc: """ A module that implements the `OffBroadway.Splunk.Client` behaviour. This module is responsible for fetching and acknowledging the messages from Splunk. All options passed to the producer will also be forwarded to the client. """, default: OffBroadway.Splunk.SplunkClient ], config: [ type: :keyword_list, keys: [ base_url: [type: :string, doc: "Base URL to Splunk instance."], api_token: [ doc: "API token used to authenticate on the Splunk instance.", type: :string ], api_version: [ doc: """ Some API endpoints are [available](https://docs.splunk.com/Documentation/Splunk/9.0.3/RESTREF/RESTsearch) in multiple versions. Sets the API version to use (where applicable). """, type: {:in, ["v1", "v2"]}, default: "v2" ], endpoint: [ doc: """ Configures if output should be consumed from the `events` or `results` endpoint of the Splunk API. In Splunk terminology, `results` are the output *after* transformation commands has been executed. Consider the following search command: * | head 1000 | stats count by sourcetype The output from the command above is no longer the raw `events` because they have been transformed by the search command. Splunk call these transformed events `results`. To receive the computed values, you should choose to use the `results` endpoint. If you want to receive all events that produced this output, choose the `events` endpoint. """, type: {:in, [:events, :results]}, default: :events ], offset: [ doc: """ Initial offset can be used to skip `N` before starting to consume messages. If using `events` endpoint, a negative value can be used to start consuming "from the end", where `-1` is the last available offset. """, type: :integer, default: 0 ], max_events: [ doc: """ If set to a positive integer, automatically shut down the pipeline after consuming `max_events` messages from the Splunk API. """, type: {:custom, __MODULE__, :type_nil_or_pos_integer, [[{:name, :max_events}]]} ] ], doc: """ A set of config options that overrides the default config for the `splunk_client` module. Any option set here can also be configured in `config.exs`. """, default: [] ], test_pid: [type: :pid, doc: false], message_server: [type: :pid, doc: false] ] end def type_non_empty_string("", [{:name, name}]), do: {:error, "expected :#{name} to be a non-empty string, got: \"\""} def type_non_empty_string(value, _) when not is_nil(value) and is_binary(value), do: {:ok, value} def type_non_empty_string(value, [{:name, name}]), do: {:error, "expected :#{name} to be a non-empty string, got: #{inspect(value)}"} def type_nil_or_pos_integer(nil, [{:name, _}]), do: {:ok, nil} def type_nil_or_pos_integer(value, [{:name, _}]) when is_integer(value) and value > 0, do: {:ok, value} def type_nil_or_pos_integer(value, [{:name, name}]), do: {:error, "expected :#{name} to be nil or a positive integer, got: #{inspect(value)}"} end