Pertanyaan Codahale Metrics: menggunakan @ metrik metrik anotasi di Jawa biasa


Saya mencoba menambahkan metrik ke aplikasi Java biasa menggunakan metrik codahale. Saya ingin menggunakan penjelasan @Timed, tetapi tidak jelas bagi saya MetricRegistry mana yang digunakan, atau cara memberi tahu MetricRegistry mana yang akan digunakan. Aplikasi ini adalah aplikasi Java 8 biasa, dibangun dengan Maven 3, tidak ada Spring, no Hibernate.

Saya tidak dapat menemukan dokumentasi apa pun tentang cara menerapkan @Timed dalam dokumentasi dropwizard: https://dropwizard.github.io/metrics/3.1.0/manual/

Saya telah menambahkan dependensi ini:

<dependency>
  <groupId>io.dropwizard.metrics</groupId>
  <artifactId>metrics-core</artifactId>
  <version>3.1.0</version>
</dependency>
<dependency>
  <groupId>com.codahale.metrics</groupId>
  <artifactId>metrics-annotation</artifactId>
  <version>3.0.2</version>
</dependency>

Ketika saya menggunakan panggilan programatik untuk Timer, saya bisa mendapatkan laporan karena saya tahu MetricsRegistry mana yang digunakan:

static final MetricRegistry metrics = new MetricRegistry();
private void update() throws SQLException {
  Timer.Context time = metrics.timer("domainobject.update").time();
  try {
    [...]
  } finally {
    time.stop();
  }
}

Tetapi ketika saya menggunakan anotasi @Timed yang jauh lebih elegan, saya tidak tahu registri mana yang digunakan, dan oleh karena itu saya tidak dapat membuat reporter, yang berarti saya tidak bisa melaporkan metrik (saya bahkan tidak yakin apakah ini benar-benar apa pun):

@Timed(name = "domainobject.update")
private void update() throws SQLException {
    [...]
}

Mohon saran tentang cara membuat @Timed dan anotasi Metrik lainnya berfungsi dalam aplikasi Java biasa.

Informasi tambahan: Alasan saya menemukan ini aneh adalah bahwa saya telah menambahkan kerangka Lombok dan penjelasan @ Slf4j bekerja. Saya menambahkan Lombok sebagai ketergantungan pada maven pom.xml:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.14.8</version>
</dependency>

Dan saya dapat menggunakan anotasi kelas @ Sl4fj untuk menambahkan logger ke kelas tanpa mengacaukan variabel anggota:

@Slf4j
public class App {
  public void logsome(){
    log.info("Hello there");
  }
}

Jadi jika itu mungkin dengan hanya menambahkan ketergantungan, saya rasa saya hanya kehilangan dependensi atau konfigurasi untuk mendapatkan pekerjaan anomali @Timed, seperti yang dijelaskan di atas.

(ngomong-ngomong, periksa Lombok, itu akan membuat hidup Anda lebih mudah: http://projectlombok.org/ )


32
2018-02-13 12:26


asal


Jawaban:


Singkat cerita, Anda tidak bisa menggunakannya @Timed tanpa semacam AOP (baik itu Spring AOP atau AspectJ).

Satu atau dua minggu yang lalu, saya juga memutuskan untuk menambahkan metrik ke proyek kami dan memilih AspectJ untuk tugas ini (sebagian besar karena saya menggunakannya di masa lalu untuk tujuan yang sama dan karena memungkinkan untuk meng-compile-time weaving sementara Spring hanya mengizinkan runtime via proxies) .

Anda harus dapat menemukan semua informasi dan petunjuk yang diperlukan di sini: https://github.com/astefanutti/metrics-aspectj.

Untuk Lombok, saya kira mereka menggunakan prosesor anotasi javac bawaan:

Titik lain pertentangan adalah implementasi dari kedua kode yang mendukung integrasi IDE serta prosesor anotasi javac. Kedua bagian Proyek Lombok ini menggunakan API non-publik untuk mencapai sihir mereka. Ini berarti ada risiko bahwa Proyek Lombok akan rusak dengan rilis IDE atau JDK berikutnya.


12
2018-02-14 11:35



Menggunakan @Timed sebenarnya tidak memerlukan penggunaan AOP, seperti yang sebelumnya diklaim dalam jawaban teratas, jika Anda berada di dalam wadah dan menggunakan salah satu perpustakaan instrumentasi Dropwizard. Lihat modul Jersey 2.x misalnya, yang dapat Anda lihat menggunakan refleksi (seperti yang dilakukan orang lain yang saya lihat), jika Anda membaca sumber.

Anda dapat membaca semua modul ini di dokumen Dropwizard di bawah yang sesuai "Menginstruksikan ____"peluru.

Saya memahami OP secara eksplisit TIDAK bekerja dalam wadah seperti itu, tetapi saya ingin menawarkan info ini, karena banyak dari kita yang mencari jawaban ini mungkin bekerja pada layanan web modern yang dapat mendaftarkan sumber daya tersebut dalam lingkungan runtime.


10
2017-08-23 16:05



Gunakan MetricRegistry bawaan yang diakses dari parameter bootstrap dalam metode inisialisasi kelas aplikasi Anda.

@Override
public void initialize(final Bootstrap<Configuration> bootstrap) {
    final JmxReporter reporter = JmxReporter.forRegistry(bootstrap.getMetricRegistry()).build();
    reporter.start();
}

5
2017-08-04 19:21



Seperti jawaban yang lain menyatakan, Anda harus memiliki sesuatu di aplikasi untuk mendengarkan kelas instantiated Anda dan periksa untuk penjelasan @Timed.

Jika Anda menggunakan Guice, Anda dapat menggunakan: https://github.com/palominolabs/metrics-guice


3
2018-03-08 01:27



AOP terlalu berlebihan dan tidak sesuai untuk penggunaan @timed, secara umum   berbicara.

Registri metrik default menulis @metrik yang diubah ke ConcurrentHashMap dan tidak melampirkan pendengar yang berarti.

DropWizard Bootstrap constructor:

/**
 * Creates a new {@link Bootstrap} for the given application.
 * @param application a Dropwizard {@link Application}
 */
public Bootstrap(Application<T> application) {
    this.application = application;
    this.objectMapper = Jackson.newObjectMapper();
    this.bundles = Lists.newArrayList();
    this.configuredBundles = Lists.newArrayList();
    this.commands = Lists.newArrayList();
    this.validatorFactory = Validators.newValidatorFactory();


    // returns new ConcurrentHashMap<String, Metric>(); 
    this.metricRegistry = new MetricRegistry(); 


    this.configurationSourceProvider = new FileConfigurationSourceProvider();
    this.classLoader = Thread.currentThread().getContextClassLoader();
    this.configurationFactoryFactory = new DefaultConfigurationFactoryFactory<T>();
}

Jadi, Anda perlu membangun / memulai / mendaftarkan registri metrik yang sesuai di   memesan untuk melihat hasil.

Di sini saya menggunakan JMX:

@Override
public void initialize(Bootstrap<PayloadStorageConfiguration> bootstrap) {
    JmxReporter.forRegistry(bootstrap.getMetricRegistry()).build().start();
}

Itu saja yang perlu Anda lakukan.

Berikut ini contoh keluaran (jalankan jconsole terhadap aplikasi / server Java Anda untuk melihat hasil JMX):

enter image description here


3
2018-03-22 23:14



Anda juga bisa menggunakan stagemonitor-core untuk itu. Lihat dokumentasi sini dan sini. Keuntungannya adalah bahwa stagemonitor (yang gratis & open source btw) tidak tergantung pada AOP berbasis kontainer seperti Spring AOP atau pencegat EJB. Menggunakan manipulasi bytecode melalui runtime attachment yang berarti bahwa Anda bahkan tidak perlu menambahkan -javaagent bendera ke startup aplikasi Anda - dependensi biasa sudah cukup.

Jika Anda ingin mengukur waktu eksekusi dalam aplikasi web atau dalam aplikasi EJB jarak jauh, Anda bahkan tidak perlu secara manual membuat anotasi kode Anda. Selain itu, stagemonitor menawarkan dasbor Grafana dan Kibana yang dikonfigurasi sebelumnya.

Disclaimer: Saya adalah salah satu pengembang stagemonitor


0
2018-05-19 09:33



Dalam versi Dropwizard yang lebih baru (saya menggunakan 0.9.2), Anda dapat mengakses default MetricRegistry melalui lingkungan pengaturan io.dropwizard.setup.Environment. Default ini MetricRegistry sudah memiliki InstrumentedResourceMethodApplicationListener terkait dengannya, yang mendengarkan semua metrik sumber daya Anda.

Jika Anda telah mendaftarkan sumber daya dengan JerseyEnvironment seperti di bawah,

environment.jersey().register(resource);

Anda hanya perlu membubuhi keterangan metode sumber daya (atau kelas) Anda dengan @Timed, @Metered atau @ExceptionMetered untuk mendaftarkan metrik masing-masing.

@POST
@Timed
public String show() {
    return "yay";
}

Anda dapat menetapkan Reporter (seperti Slf4jReporter atau JmxReporter) ke default MetricRegistry seperti di bawah

Slf4jReporter.forRegistry(environment.metrics()).build();

Sebagai tes cepat untuk melihat apakah metrik Anda telah terdaftar, Anda dapat membuat GET panggilan ke URL http://localhost:8081/metrics atau URL Metrik Admin yang sesuai di lingkungan pengujian Anda.

Beberapa versi lainnya mengharuskan Anda untuk mendaftarkan secara eksplisit InstrumentedResourceMethodApplicationListener seperti yang ditunjukkan di Dokumen ini


0
2017-07-07 15:38



contoh sederhana / kanan-ke-titik ini https://karollotkowski.wordpress.com/2015/10/19/api-endpoint-in-one-minute-with-dropwizard/hanya menunjukkan itu hanya perlu anotasi

enter image description here


0
2018-04-16 20:01