[[scripts-templates]] === Scripts and Templates [float] [[scripts]] ==== Using Scripts [float] [[templates]] ==== Using Templates You can use templates to define dynamic content for a watch. At execution time, a template can pull in data from the watch's execution context. For example, you could use a template to populate the `subject` field for an `email` action with data stored in the watch payload. You can use templates in a variety of places: * The <> input supports templates in the `path`, `params`, `headers` and `body` fields. * The <> action supports templates in the `from`, `reply_to`, `priority`, `to` `cc`, `bcc`, `subject`, `body.text` and `body.html` fields. * The <> action supports templates in the `path`, `params`, `headers` and `body` fields. You specify templates using the https://mustache.github.io[Mustache] scripting language. The Watcher template engine uses Elasticsearch's script engine infrastructure, which supports: * Caching - templates are compiled and cached by Elasticsearch to optimize recurring execution. * Indexed Templates - like other scripts, you can {ref}/modules-scripting.html#_indexed_scripts[index] your templates and refer to them by id. * Template Files - you can store template files in `config/scripts` and refer to them by name. {ref}/modules-scripting.html#_automatic_script_reloading[Autoloading] is also supported. [NOTE] =============================== While Elasticsearch supports Mustache out of the box, Watcher ships with its own version registered under `xmustache`. This is because the default Mustache implementation in Elasticsearch 1.5 lacks array/list access support. `xmustache` adds this support to enable easy array access. For example, to refer to the source of the third search hit in the payload use `{{ctx.payload.hits.hits.2._source}}`. When this feature is available in Elasticsearch, we expect to remove `xmustache` from Watcher and use the version that ships with Elasticsearch. =============================== [float] [[accessing-template-values]] ==== Accessing the Watch Context and Template Parameters A template can reference any of the values in the watch execution context or values explicitly passed through template parameters. The <> is shown in the following snippet: [source,js] ---------------------------------------------------------------------- { "ctx" : { "metadata" : { ... }, "payload" : { ... }, "watch_id" : "", "execution_time" : "20150220T00:00:10Z", "trigger" { "triggered_time" : "20150220T00:00:10Z", "scheduled_time" : "20150220T00:00:00Z" } } } ---------------------------------------------------------------------- For example, if the context metadata contains a `color` field, you can access its value with the expression `{{ctx.metadata.color}}`. If the context payload contains the results of a search, you could access the source of the 3rd search hit in the payload with the following expression `{{ctx.payload.hits.hits.3._source}}`. You can also pass arbitrary template parameters for a field by specifying the `params` attribute. Templates can then reference these parameters by name. For example, the following snippet defines and references the `color` parameter. [source,js] ---------------------------------------------------------------------- { "actions" : { "email_notification" : { "email" : { "subject" : { "inline" : "{{color}} alert", "params" : { "color" : "red" } } } } } } ---------------------------------------------------------------------- [float] [[inline-templates]] ==== Inline Templates The default template type is `inline`, where you specify the template directly in the value of a field. For example, the following snippet configures the subject of the `email` action using an inline template that references the `color` value in the metadata defined in the watch context. [source,js] ---------------------------------------------------------------------- { "metadata" : { "color" : "red" }, ... "actions" : { "email_notification" : { "email" : { "subject" : "{{ctx.metadata.color}} alert" } } } } ---------------------------------------------------------------------- You can also explicitly indicate that the template is inlined using the formal object definition of the template: [source,js] ---------------------------------------------------------------------- "actions" : { "email_notification" : { "email" : { "subject" : { "inline" : "{{ctx.metadata.color}} alert" } } } } ---------------------------------------------------------------------- [float] [[index-templates]] ==== Indexed Templates If you choose to {ref}/modules-scripting.html#_indexed_scripts[index your templates], you can reference them by id. For this, you'll need to use the formal object definition of the template and refer to the template id using the `id` field. For example, the following snippet references the indexed template with the id `email_notification_subject". [source,js] ---------------------------------------------------------------------- { ... "actions" : { "email_notification" : { "email" : { "subject" : { "id" : "email_notification_subject", "params" : { "color" : "red" } } } } } } ---------------------------------------------------------------------- [float] [[file-templates]] ==== File Templates If you store templates in files in the `config/scripts` directory, you can reference them by name. For this, you'll need to use the formal object definition of the template and refer to the template file by its name using the `file` field. For example, the following snippet references the template file `email_notification_subject.mustache`. [source,js] ---------------------------------------------------------------------- { ... "actions" : { "email_notification" : { "email" : { "subject" : { "file" : "email_notification_subject", "params" : { "color" : "red" } } } } } } ---------------------------------------------------------------------- NOTE: The `config/scripts` directory is scanned periodically for changes. New and changed templates are reloaded and deleted templates are removed from the preloaded scripts cache. For more information, see {ref}/modules-scripting.html#_automatic_script_reloading[Automatic Script Reloading] in the Elasticsearch Reference.