# Test for __name__ label drop.
load 5m
	metric_total{env="1"}		0 60 120
	another_metric_total{env="1"}	60 120 180

# Does not drop __name__ for vector selector.
eval instant at 10m metric_total{env="1"}
	metric_total{env="1"} 120

# Drops __name__ for unary operators.
eval instant at 10m -metric_total
	{env="1"} -120

# Drops __name__ for binary operators.
eval instant at 10m metric_total + another_metric_total
	{env="1"} 300

# Does not drop __name__ for binary comparison operators.
eval instant at 10m metric_total <= another_metric_total
	metric_total{env="1"} 120

# Drops __name__ for binary comparison operators with "bool" modifier.
eval instant at 10m metric_total <= bool another_metric_total
	{env="1"} 1

# Drops __name__ for vector-scalar operations.
eval instant at 10m metric_total * 2
	{env="1"} 240

# Drops __name__ for instant-vector functions.
eval instant at 10m clamp(metric_total, 0, 100)
	{env="1"} 100

# Drops __name__ for round function.
eval instant at 10m round(metric_total)
	{env="1"} 120

# Drops __name__ for range-vector functions.
eval instant at 10m rate(metric_total{env="1"}[10m])
	{env="1"} 0.2

# Does not drop __name__ for last_over_time function.
eval instant at 10m last_over_time(metric_total{env="1"}[10m])
	metric_total{env="1"} 120

# Drops name for other _over_time functions.
eval instant at 10m max_over_time(metric_total{env="1"}[10m])
	{env="1"} 120

# Allows relabeling (to-be-dropped) __name__  via label_replace.
eval instant at 10m label_replace(rate({env="1"}[10m]), "my_name", "rate_$1", "__name__", "(.+)")
	{my_name="rate_metric_total", env="1"} 0.2
	{my_name="rate_another_metric_total", env="1"} 0.2

# Allows preserving __name__ via label_replace.
eval instant at 10m label_replace(rate({env="1"}[10m]), "__name__", "rate_$1", "__name__", "(.+)")
	rate_metric_total{env="1"} 0.2
	rate_another_metric_total{env="1"} 0.2

# Allows relabeling (to-be-dropped) __name__  via label_join.
eval instant at 10m label_join(rate({env="1"}[10m]), "my_name", "_", "__name__")
	{my_name="metric_total", env="1"} 0.2
	{my_name="another_metric_total", env="1"} 0.2

# Allows preserving __name__ via label_join.
eval instant at 10m label_join(rate({env="1"}[10m]), "__name__", "_", "__name__", "env")
	metric_total_1{env="1"} 0.2
	another_metric_total_1{env="1"} 0.2

# Does not drop metric names from aggregation operators.
eval instant at 10m sum by (__name__, env) (metric_total{env="1"})
	metric_total{env="1"} 120

# Aggregation operators by __name__ lead to duplicate labelset errors (aggregation is partitioned by not yet removed __name__ label).
# This is an accidental side effect of delayed __name__ label dropping
eval_fail instant at 10m sum by (__name__) (rate({env="1"}[10m]))

# Aggregation operators aggregate metrics with same labelset and to-be-dropped names.
# This is an accidental side effect of delayed __name__ label dropping
eval instant at 10m sum(rate({env="1"}[10m])) by (env)
	{env="1"} 0.4

# Aggregationk operators propagate __name__ label dropping information.
eval instant at 10m topk(10, sum by (__name__, env) (metric_total{env="1"}))
	metric_total{env="1"} 120

eval instant at 10m topk(10, sum by (__name__, env) (rate(metric_total{env="1"}[10m])))
	{env="1"} 0.2
