grain:
  {%- if pillar.get('prometheus', {}).get('collector') %}
    {%- from "prometheus/map.jinja" import server as prometheus_server with context %}
  prometheus:
    {%- set service_grains = {'prometheus': {'server': {'alert': {}, 'recording': {}, 'target': {}}}} %}
    {%- for service_name, service in pillar.items() %}
      {%- if service.get('_support', {}).get('prometheus', {}).get('enabled', False) %}
        {%- set grains_fragment_file = service_name+'/meta/prometheus.yml' %}
        {%- macro load_grains_file() %}{% include grains_fragment_file ignore missing %}{% endmacro %}
        {%- set grains_yaml = load_grains_file()|load_yaml %}
        {%- if grains_yaml is mapping %}
          {%- set service_grains = salt['grains.filter_by']({'default': service_grains}, merge={'prometheus': grains_yaml}) %}
        {%- endif %}
      {%- endif %}
    {%- endfor %}
    {{ service_grains|yaml(False)|indent(4) }}
  {%- endif %}

{#-
  vim: syntax=jinja
-#}
