Нестабильность пользовательских метрик - PullRequest
1 голос
/ 16 марта 2020

Я добавил https://micrometer.io на наш промежуточный сервер в облаке Google. Метри c не отображается в типах ресурсов «Cloud Run Revision». Он виден только в том случае, если я выбрал «Глобальный», как показано здесь ...

enter image description here

Инструкции были очень простыми и очень четкими (НАМНОГО НЕ СРАВНИТЕ opencensus, который имеет способ переопределить API). Фактически, в отличие от opencensus, он работал «из коробки», за исключением того, что он не записывается в «Cloud Run Revision».

Я даже не могу выбрать имя_сервиса в фильтре, поэтому после развертывания в производство metri c будет записывать ОБА ПРОДУКТА и постановку, что не то, что мы хотим.

  1. Как мне отладить микрометр дальше
  2. Если кто-то также знает, что это за проблема, может возникнуть проблема , это было бы здорово, а? (хотя я не возражаю изучать микрометр и отлаживать его немного больше).

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

На данный момент единственными доступными типами отслеживаемых ресурсов в ваших пользовательских метриках являются:

  • aws_ec2_instance: экземпляр Amazon EC2.
  • dataflow_job: Задание потока данных.
  • gce_instance: Экземпляр Compute Engine.
  • gke_container: Экземпляр контейнера GKE.
  • generic_node: Пользовательский вычислительный узел.
  • generic_task: Пользовательская задача.
  • global: Используйте этот ресурс, когда другой тип ресурса не подходит. Для большинства случаев использования generic_node или generic_task - лучший выбор, чем глобальный.
  • k8s_cluster: кластер Kubernetes.
  • k8s_container: контейнер Kubernetes.
  • k8s_node: узел Kubernetes.
  • k8s_pod: модуль Kubernetes.

Таким образом, глобальный является правильным типом отслеживаемого ресурса в этом случае, поскольку пока еще нет типа отслеживаемого ресурса Cloud Run.

Чтобы лучше определить показатели, вы можете создавать метри c дескрипторы, либо самосоздание или вручную

0 голосов
/ 17 марта 2020

Для полноты картины я сейчас записываю всю статистику JVM, но у меня есть новая публикация об агрегации на веб-сайте Google, которая выглядит как новая проблема ...

Google Cloud Metrics и MicroMeter Отчеты JVM (это ошибка микрометра или?)

Мой код, который сделал трюк, был (и использование revisionName является КРИТИЧЕСКИМ для получения ошибок !!!)

        String projectId = MetadataConfig.getProjectId();
        String service = System.getenv("K_SERVICE");
        String revisionName = System.getenv("K_REVISION");
        String config = System.getenv("K_CONFIGURATION");
        String zone = MetadataConfig.getZone();

        Map<String, String> map = new HashMap<>();
        map.put("namespace", service);
        map.put("job", "nothing");
        map.put("task_id", revisionName);
        map.put("location", zone);

        log.info("project="+projectId+" svc="+service+" r="+revisionName+" config="+config+" zone="+zone);

        StackdriverConfig stackdriverConfig = new OurGoogleConfig(projectId, map);

        //figure out how to put in template better
        MeterRegistry googleRegistry = StackdriverMeterRegistry.builder(stackdriverConfig).build();
        Metrics.addRegistry(googleRegistry);
        //This is what would be used in Development Server
        //Metrics.addRegistry(new SimpleMeterRegistry());
        //How to expose on @backend perhaps at /@metrics

        CompositeMeterRegistry registry = Metrics.globalRegistry;
        new ClassLoaderMetrics().bindTo(registry);
        new JvmMemoryMetrics().bindTo(registry);
        new JvmGcMetrics().bindTo(registry);
        new ProcessorMetrics().bindTo(registry);
        new JvmThreadMetrics().bindTo(registry);

и тогда конфиг прост ...

private static class OurGoogleConfig implements StackdriverConfig {

    private String projectId;
    private Map<String, String> resourceLabels;

    public OurGoogleConfig(String projectId, Map<String, String> resourceLabels) {
        this.projectId = projectId;
        this.resourceLabels = resourceLabels;
    }

    @Override
    public String projectId() {
        return projectId;
    }
    @Override
    public String get(String key) {
        return null;
    }
    @Override
    public String resourceType() {
        return "generic_task";
    }

    @Override
    public Map<String, String> resourceLabels() {
        //they call this EVERY time, so save on memory by only passing the same
        //map every time instead of re-creating it...
        return resourceLabels;
    }
};
...