09 Jul 2025 10:02 AM
I was using DQL to create a visualization that displays my EBS volumes and shows how close they are to hitting their maximum IOPS, or list if they are already under high usage.
I did something like this:
timeseries by:{dt.entity.ebs_volume}, {
avg_read_iops = avg(dt.cloud.aws.ebs.ops.read),
avg_write_iops = avg(dt.cloud.aws.ebs.ops.write),
avg_queue = avg(dt.cloud.aws.ebs.queue)
}
| fieldsAdd total_iops = arraySum(avg_read_iops) + arraySum(avg_write_iops)
| fieldsAdd queue_peak = coalesce(arrayMax(avg_queue), 0.0)
| fieldsAdd flag = if(queue_peak > 5, then: "High Queue",
else: if(total_iops >= 2700, then: "High IOPS", else: "Normal"))
| filter flag != "Normal"
| sort total_iops desc
But this takes 2700 as a fixed HIgh IOPS rate.
Now I can get a lot of information about my volumes:
fetch dt.entity.ebs_volume
| fieldsAdd arn, deviceName, entity.name, id, iops, tags, belongs_to[dt.entity.ec2_instance]
What I assumed was possible, is that I can use the information value from iops from dt.entity.ebs_volume and calculate if I am for example at 90% of my configured IOPS. Also using something like the entity.name in my graph would be super helpful.
My main goal is as follows:
Display a graph or table with volumes, that are showing they are hitting their configured IOPS limits.
Hope anyone can help me out on this.