anchor.diff:        tag_separator = mkDefOpt types.str "," ''
           The tag separator used to separate concatenated GCE instance network tags.
   
  -        See the GCP documentation on network tags for more information: <link
  -        xlink:href="https://cloud.google.com/vpc/docs/add-remove-network-tags"
  -        />
  -      '';
  -    };
  +        See the GCP documentation on network tags for more information:
  +        <link xlink:href="https://cloud.google.com/vpc/docs/add-remove-network-tags" />
  +      '';
  +    };
  +  };
  +
  +  promTypes.hetzner_sd_config = mkSdConfigModule {
  +    role = mkOption {
  +      type = types.enum [ "robot" "hcloud" ];
  +      description = ''
  +        The Hetzner role of entities that should be discovered.
  +        One of <literal>robot</literal> or <literal>hcloud</literal>.
  +      '';
  +    };
  +
  +    port = mkDefOpt types.int "80" ''
  +      The port to scrape metrics from.
  +    '';
  +
  +    refresh_interval = mkDefOpt types.str "60s" ''
  +      The time after which the servers are refreshed.
  +    '';
     };
   
     promTypes.http_sd_config = types.submodule {
  
positive.code:     "--alertmanager.notification-queue-capacity=${toString cfg.alertmanagerNotificationQueueCapacity}"
      "--alertmanager.timeout=${toString cfg.alertmanagerTimeout}s"
    ] ++ optional (cfg.webExternalUrl != null) "--web.external-url=${cfg.webExternalUrl}"
      ++ optional (cfg.retentionTime != null)  "--storage.tsdb.retention.time=${cfg.retentionTime}";
  
    filterValidPrometheus = filterAttrsListRecursive (n: v: !(n == "_module" || v == null));
    filterAttrsListRecursive = pred: x:
      if isAttrs x then
        listToAttrs (
          concatMap (name:
            let v = x.${name}; in
            if pred name v then [
              (nameValuePair name (filterAttrsListRecursive pred v))
            ] else []
          ) (attrNames x)
        )
      else if isList x then
        map (filterAttrsListRecursive pred) x
      else x;
  
    mkDefOpt = type : defaultStr : description : mkOpt type (description + ''
  
      Defaults to <literal>${defaultStr}</literal> in prometheus
      when set to <literal>null</literal>.
    '');
  
    mkOpt = type : description : mkOption {
      type = types.nullOr type;
      default = null;
      inherit description;
    };
  
    promTypes.globalConfig = types.submodule {
      options = {
  
negative.code:         by the target will be ignored.
        '';
  
        scheme = mkDefOpt (types.enum [ "http" "https" ]) "http" ''
          The URL scheme with which to fetch metrics from targets.
        '';
  
  