DQL
Questions about Dynatrace Query Language
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

DQL - Anomaly detector interval 1m

AntonPineiro
DynaMight Guru
DynaMight Guru

Hi,

I would like to create an anomaly detector disk alert when disk is higher than some value. I am trying it using this DQL:

timeseries t_disk = avg(dt.host.disk.used.percent),
filter: {
  matchesValue(role, "ORACLE") AND
  matchesValue(entityAttr(dt.entity.disk, "entity.name"), "/opt")
}, by:{dt.entity.host, dt.entity.disk}, interval: 1m
| fieldsAdd server = entityName(dt.entity.host)
| fieldsAdd disk = entityName(dt.entity.disk)
| fieldsAdd `disk_used` = arrayAvg(t_disk)
| fieldsRemove interval, t_disk
| join [
    timeseries disk.used_sum = avg(dt.host.disk.used), disk.avail_sum = avg(dt.host.disk.avail), by:{dt.entity.disk}
    | fieldsAdd total_disk = toLong((arrayAvg(disk.used_sum) + arrayAvg(disk.avail_sum)))
    | fieldsKeep total_disk, dt.entity.disk
  ], on:{dt.entity.disk}
| fieldsAdd `disk_size`  = right.total_disk
| fieldsRemove right.dt.entity.disk, right.total_disk
| filter `disk_size` > 5000000000

I am getting some interval error:

error.png

But I think issue is another thing. Do you have some suggestion? Have you received that error message before?

Best regards

❤️ Emacs ❤️ Vim ❤️ Bash ❤️ Perl
2 REPLIES 2

t_pawlak
Leader

Hi,
I thinkk the problem is here:
arrayAvg(t_disk) collapses the time series into a single value and fieldsRemove interval removes the interval information required by the detector

So for anomaly detection, your query should keep the original time series in the final output, and only use the join for filtering/enrichment. Try this:

timeseries t_disk = avg(dt.host.disk.used.percent),
filter: {
  matchesValue(entityAttr(dt.entity.disk, "entity.name"), "/boot")
},
by:{dt.entity.host, dt.entity.disk},
interval: 1m
| join [
    timeseries disk.used_sum = avg(dt.host.disk.used),
              disk.avail_sum = avg(dt.host.disk.avail),
              by:{dt.entity.disk},
              interval: 1m
    | fieldsAdd total_disk = toLong(arrayAvg(disk.used_sum) + arrayAvg(disk.avail_sum))
    | fieldsKeep total_disk, dt.entity.disk
  ], on:{dt.entity.disk}
| fieldsAdd server = entityName(dt.entity.host)
| fieldsAdd disk = entityName(dt.entity.disk)
| fieldsAdd disk_size = right.total_disk

disk.jpg

Of course change filters 😉 

Hi,

You are right, before query should work if this line is removed:

| fieldsRemove interval, t_disk

 Thank you!

Best regards

❤️ Emacs ❤️ Vim ❤️ Bash ❤️ Perl

Featured Posts