function Prometheus:metric_data()

in kong/kong/plugins/prometheus/prometheus.lua [857:931]


function Prometheus:metric_data(write_fn)
  if not self.initialized then
    ngx_log(ngx.ERR, "Prometheus module has not been initialized")
    return
  end
  write_fn = write_fn or ngx_print

  
  self._counter:sync()

  local keys = self.dict:get_keys(0)
  local count = #keys
  for k, v in pairs(self.local_metrics) do
    keys[count+1] = k
    count = count + 1
  end
  
  
  table_sort(keys)

  local seen_metrics = {}
  local output = {}
  local output_count = 0

  local function buffered_print(data)
    if data then
      output_count = output_count + 1
      output[output_count] = data
    end

    if output_count >= 100 or not data then
      write_fn(output)
      output_count = 0
      tb_clear(output)
    end
  end

  for _, key in ipairs(keys) do
    yield()

    local value, err
    local is_local_metrics = true
    value = self.local_metrics[key]
    if not value then
      is_local_metrics = false
      value, err = self.dict:get(key)
    end

    if value then
      local short_name = short_metric_name(key)
      if not seen_metrics[short_name] then
        local m = self.registry[short_name]
        if m then
          if m.help then
            buffered_print(st_format("# HELP %s%s %s\n",
              self.prefix, short_name, m.help))
          end
          if m.typ then
            buffered_print(st_format("# TYPE %s%s %s\n",
              self.prefix, short_name, TYPE_LITERAL[m.typ]))
          end
        end
        seen_metrics[short_name] = true
      end
      if not is_local_metrics then 
        key = fix_histogram_bucket_labels(key)
      end
      buffered_print(st_format("%s%s %s\n", self.prefix, key, value))
    else
      self:log_error("Error getting '", key, "': ", err)
    end
  end

  buffered_print(nil)
end