| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | [role="xpack"][[ml-configuring-url]]= Adding custom URLs to machine learning resultsYou can optionally attach one or more custom URLs to your {anomaly-jobs}. Theselinks appear in the anomalies table in the *Anomaly Explorer* and*Single Metric Viewer* and can direct you to dashboards, the *Discover* app, or external websites. For example, you can define a custom URL that provides a wayfor users to drill down to the source data from the results set:[role="screenshot"]image::images/ml-customurl.jpg["An example of the custom URL links in the Anomaly Explorer anomalies table"]When you create or edit an {anomaly-job} in {kib}, it simplifies the creationof the custom URLs for {kib} dashboards and the *Discover* app and it enablesyou to test your URLs. For example:[role="screenshot"]image::images/ml-customurl-edit.gif["Add a custom URL in {kib}",width=75%]For each custom URL, you must supply the URL and a label, which is the link textthat appears in the anomalies table. You can also optionally supply a time range. When you link to *Discover* or a {kib} dashboard, you'll have additionaloptions for specifying the pertinent {data-source} or dashboard name and queryentities.[discrete][[ml-configuring-url-strings]]== String substitution in custom URLsYou can use dollar sign ($) delimited tokens in a custom URL. These tokens aresubstituted for the values of the corresponding fields in the anomaly records.For example, the `Raw data` URL might resolve to `discover#/?_g=(time:(from:'$earliest$',mode:absolute,to:'$latest$'))&_a=(index:ff959d40-b880-11e8-a6d9-e546fe2bba5f,query:(language:kuery,query:'customer_full_name.keyword:"$customer_full_name.keyword$"'))`. In this case, the pertinent value of the `customer_full_name.keyword` fieldis passed to the target page when you click the link. TIP: Not all fields in your source data exist in the anomaly results. If afield is specified in the detector as the `field_name`, `by_field_name`,`over_field_name`, or `partition_field_name`, for example, it can be used in acustom URL. A field that is used only in the `categorization_field_name`property, however, does not exist in the anomaly results. When you create yourcustom URL in {kib}, the *Query entities* option is shown only when there areappropriate fields in the detectors.The `$earliest$` and `$latest$` tokens pass the beginning and end of the timespan of the selected anomaly to the target page. The tokens are substituted withdate-time strings in ISO-8601 format. If you selected an interval of 1 hour forthe anomalies table, these tokens use one hour on either side of the anomalytime as the earliest and latest times. You can alter this behavior by setting atime range for the custom URL.There are also `$mlcategoryregex$` and `$mlcategoryterms$` tokens, which pertainto {anomaly-jobs} where you are categorizing field values. For more informationabout this type of analysis, see <<ml-configuring-categories>>. The`$mlcategoryregex$` token passes the regular expression value of the category ofthe selected anomaly, as identified by the value of the `mlcategory` field ofthe anomaly record. The `$mlcategoryterms$` token passes the terms value of thecategory of the selected anomaly. Each categorization term is prefixed by a plus(+) character, so that when the token is passed to a {kib} dashboard, theresulting dashboard query seeks a match for all of the terms of the category.For example, the following API updates a job to add a custom URL that uses `$earliest$`, `$latest$`, and `$mlcategoryterms$` tokens:[source,console]----------------------------------POST _ml/anomaly_detectors/sample_job/_update{  "custom_settings": {        "custom_urls": [          {            "url_name": "test-link1",            "time_range": "1h",            "url_value": "discover#/?_g=(time:(from:'$earliest$',mode:quick,to:'$latest$'))&_a=(index:'90943e30-9a47-11e8-b64d-95841ca0b247',query:(language:lucene,query_string:(analyze_wildcard:!t,query:'$mlcategoryterms$')),sort:!(time,desc))"          }        ]      }}----------------------------------//TEST[skip:setup:sample_job]When you click this custom URL in the anomalies table in {kib}, it opens up the*Discover* page and displays source data for the period one hour before and after the anomaly occurred. Since this job is categorizing log messages, some `$mlcategoryterms$` token values that are passed to the target page in the querymight include `+REC +Not +INSERTED +TRAN +Table +hostname +dbserver.acme.com`.[TIP]===============================* The custom URL links in the anomaly tables use pop-ups. You must configureyour web browser so that it does not block pop-up windows or create an exceptionfor your {kib} URL.* When creating a link to a {kib} dashboard, the URLs for dashboards can be verylong. Be careful of typos, end of line characters, and URL encoding. Also ensureyou use the appropriate index ID for the target {kib} {data-source}.* If you use an influencer name for string substitution, keep in mind that itmight not always be available in the analysis results and the URL is invalid inthose cases. There is not always a statistically significant influencer for eachanomaly.* The dates substituted for `$earliest$` and `$latest$` tokens are inISO-8601 format and the target system must understand this format.* If the job performs an analysis against nested JSON fields, the tokens forstring substitution can refer to these fields using dot notation. For example,`$cpu.total$`.* {es} source data mappings might make it difficult for the query string to work.Test the custom URL before saving the job configuration to check that it worksas expected, particularly when using string substitution.===============================
 |