Grafana: Izinkan pemetaan khusus nilai variabel template -> teks tampilan

Dibuat pada 7 Nov 2014  ·  145Komentar  ·  Sumber: grafana/grafana

Kasus Penggunaan: Anda dapat menyimpan metrik berdasarkan properti 'ID' tetapi ingin UI pemilihan variabel template menggunakan label yang lebih ramah manusia. misalnya Anda melacak metrik menurut domain dengan ID domain internal tetapi ingin menggunakan URL domain di UI pemilih variabel template.

@torkelo Saya dapat mengambil bagian dalam mengimplementasikan ini, apa pendapat Anda tentang implementasi? Untuk kasus penggunaan khusus saya, saya ingin dapat menyediakan fungsi JS sewenang-wenang untuk melakukan nilai -> konversi teks karena saya perlu menekan layanan eksternal untuk pencarian. Saya berpikir implementasi awal dapat menambahkan nilai konfigurasi di dasbor JSON yang mendefinisikan fungsi pemetaan. Dukungan UI dapat ditambahkan nanti untuk menangani pemetaan yang lebih sepele dengan fungsi pemetaan yang telah dibuat sebelumnya (misalnya penggantian regex).

Juga terkait dengan ini adalah kemampuan untuk mengedit JSON dasbor lengkap melalui UI, meskipun ekspor -> edit -> impor akan berfungsi sebagai solusi jika ini terbukti sulit.

aredashboard aredashboartemplating typfeature-request

Komentar yang paling membantu

Menerapkan solusi dari @thinrope dengan benar akan menjadi perbaikan yang sangat elegan.
Jika kami dapat menggunakan JSON dalam variabel khusus, atau memiliki tipe variabel "JSON", kami dapat menyelesaikan ini tanpa peretasan dan saya tidak melihat kekurangannya.

Semua 145 komentar

Anda dapat melakukan ini dengan dasbor skrip. Tetapi Anda dipersilakan untuk mencoba mengimplementasikannya ke dalam dasbor json biasa/tersimpan.

+1

Saya juga bisa menggunakan setidaknya versi yang lebih sederhana dari ini. Sesuatu seperti pemetaan yang dikonfigurasi dari A -> B

Dalam skenario saya, saya ingin memilih nama entitas di dropdown variabel (NamaPelanggan1, NamaPelanggan2, dll.) tetapi menggunakan id numerik secara internal ketika menyangkut nama metrik.
app.requests.$customer1_ID.count

+1

Penggabungan dari #3138

Misalnya saat membuat variabel template khusus dengan nilai fooBar dan baz_quuxInternal , agar UI dapat menampilkan kotak centang sebagai "Foo bar" dan "Baz".

Ini sangat umum saat menggunakan baris berulang dan variabel khusus untuk mengurangi duplikasi, tetapi metrik tingkat atas mungkin tidak ramah pengguna.

Seseorang berpotensi mendukung ini untuk nilai templat yang ditanyakan (misalnya properti grafit) juga dengan menggunakan regex (jika penggantinya generik). Dukungan regex sudah ada, tetapi ini berlaku untuk nilai yang digunakan dan labelnya. Memilikinya digunakan untuk nilai saja akan sangat berharga.

Misalnya, jika kueri grafit memperluas kafka.messagesByTopic.myservice_* untuk digunakan dalam templat, maka seseorang mungkin ingin antarmuka pengguna menghapus awalan. Tetapi ketika digunakan di panel yang sebenarnya, awalan harus disertakan. Ini dapat diatasi (di Grafana 2.x dan yang lebih baru) sekarang karena variabel template dapat disematkan dalam properti metrik, sehingga seseorang dapat melakukan hardcode awalan di semua metrik di semua panel dan baris, tetapi itu lebih baik untuk dihindari.

Setelah nilai "label" ini ada, akan berguna untuk dapat mengaksesnya di dalam panel juga. Seperti saat menyematkan variabel dalam judul Baris dan/atau Panel. Entah kita dapat membuatnya menggunakan label secara default (jika disematkan di bidang judul), atau mungkin dengan beberapa sintaks alternatif (misalnya $$Variable , atau apa pun)

http://play.grafana.org/dashboard/db/test?editview=templating menunjukkan "Label Variabel" sebagai opsi. ini bisa ditutup?

EDIT: Saya salah memahami bug, maaf! :) Lanjut.

itu hanya opsi untuk memiliki nama yang ramah untuk variabel, bukan nilai variabel

+1

+1

+1

+1

+1

+1

Ini statusnya apa?
Apakah mungkin untuk melakukannya ?

Apakah ini mungkin untuk final 3.0?
Sepertinya fitur yang ditunggu-tunggu banyak orang. Termasuk saya :-)

+1
Saya biasanya menggunakan bagian dari ekspresi reguler yang terlihat buruk bagi pengguna.

+1

+1

+1
Tanpa ini, ekspresi regex tidak dapat digunakan dalam variabel template.

+1

+1

+1

+1

+1

+1

@mbell697 @torkelo

Saya telah menerapkan ini untuk layanan internal yang menggunakan Grafana. Karena kami menggunakan uuids untuk host (sehingga perubahan nama host tidak menghilangkan riwayat metrik dan sejumlah hal lainnya), menampilkan uuids tersebut kepada pengguna tidak dapat diterima. Saya melakukan tambalan khusus untuk kasus penggunaan kami di mana kami mendeteksi nilai uuid dan menerjemahkannya menggunakan titik akhir http aplikasi kami. Itu bekerja dengan baik untuk kami, tetapi saya lebih suka melakukan sesuatu yang umum dan diterima di hulu.

Apakah dapat diterima untuk menambahkan opsi 'variable_translation_url' yang menunjuk ke url yang dapat melakukan pemetaan? (dengan token otorisasi opsional jika diperlukan) atau variabel_translation_script yang menunjuk ke javascript src yang dapat diunduh dan dihubungkan ke templateValuesSrv.js pada titik di mana terjemahan diperlukan (jika opsi itu disetel)?

Bisakah Anda membagikan kode templateValuesSrv.js Anda? Saya ingin mencobanya.

@ZhuWanShan Ini pada dasarnya:

https://github.com/sangoma/grafana/commit/fa109c23bc92c3121173579afbd87a04d7e2f523

Perhatikan Anda akan melihat 2 pendekatan di sana. Yang pertama dimaksudkan untuk lebih umum, memperkenalkan jenis variabel template baru 'http', dengan properti 'query' yang menunjuk ke url HTTP untuk melakukan pemetaan (lihat _getHttpVariableOptions). Kemudian saya menerapkan metode kedua yang mendeteksi jika teks opsi (nilai tampilan) cocok dengan regex UUID, dan memaksa pemetaan variabel apa pun yang menggunakan panggilan HTTP hard-code ke /api/v1/nodes/grafana-hosts/ yang mengembalikan pemetaan semua opsi. Itu telah bekerja dengan baik sejauh ini, hanya perlu memiliki arahan tentang bagaimana mengubahnya menjadi metode generik.

+1

+1

Bagi siapa saja yang tertarik, saya dapat menyelesaikan kasus penggunaan khusus saya dengan menggunakan plugin Simple JSON Datasource .

Yang mengatakan plugin saat ini tidak mendukung kueri variabel templat tetapi permintaan tarik saya yang memperbaiki masalah telah digabungkan menjadi master. Rilis plugin Grafana.net yang diperbarui harus mengikuti di beberapa titik.

Dengannya Anda dapat menggunakan titik akhir HTTP khusus sebagai sumber data di Grafana. Mereka hanya perlu menerapkan 4 metode . Saat digunakan dengan variabel templat berbasis kueri, titik akhir HTTP akan menerima permintaan API /search dan badan akan menjadi objek JSON dalam bentuk: { "target": "{template query content here}" } . Anda dapat mengurai konten kueri sesuka Anda.

Mengembalikan array nilai dari titik akhir Anda akan membuat daftar nilai variabel template yang mendasari ["custom value 1", "custom value 2"] dalam bentuk: [{ "text": "custom value 1", value: 0 }] di mana properti text adalah nilai yang dikembalikan per item array dan properti value adalah indeks variabel dalam array kembali.

Atau Anda dapat mengembalikan larik objek teks/nilai [{ "text": "label", "value": 123 }] dan Grafana akan menggunakan properti text sebagai label variabel templat, dan properti value sebagai nilai mentah dari variabel templat.

Dimungkinkan untuk secara dinamis menyuntikkan variabel templat lain ke dalam kueri dalam bentuk regex dan mengirimkannya ke titik akhir secara dinamis untuk diproses.

Ini tidak akan menyelesaikan semua skenario alias, tetapi memiliki sumber data HTTP arbitrer yang dapat digunakan untuk variabel template, termasuk memasukkan variabel template lain secara dinamis ke dalam kueri template adalah alat yang bagus untuk dimiliki.

saya manusia.

+1

+1

+1

+1

+1

+1

+1000

+1

+2

Akan sangat berguna untuk memiliki ini. Akibatnya, saya memiliki banyak objek yang memiliki nama dan uuid. Saya ingin menampilkan nama, tetapi menyimpan uuid dalam variabel.

Akan sangat bagus jika kita bisa melakukan sesuatu seperti memiliki:

Kueri (sudah ada): TAMPILKAN NILAI TAG DARI "vcd_vm" DENGAN KUNCI = "uuid" di mana "OrgVdc" =~ /^$vDC$/)

Label (baru): TAMPILKAN NILAI TAG DARI "vcd_vm" DENGAN KUNCI = "nama" di mana "uuid" =~ /^$tag$/)

+1

+1

+1

+1

+1

+1

+1

Akan lebih bagus jika variabel template 'Kustom' mengambil sebagai input daftar 'nilai' dan daftar 'label' (pada dasarnya, hash/dict khusus)

+1

+1

Ini akan berguna untuk data AWS CloudFront, seperti yang diekspor oleh eksportir cloudwatch resmi. Data untuk CloudFront ditampilkan oleh ID, yang tidak digunakan manusia. Jauh lebih mudah bagi manusia yang melihat grafik untuk melihat "foo.example.com; bar.example.com" daripada "EAUUWLGUQEPFWV; EVWWU9PGWIB"...

+1

Pertama, terima kasih telah mengembangkan produk yang luar biasa dan membagikannya kepada dunia!

Adakah indikasi tentang kemungkinan penerapannya dalam beberapa bulan mendatang? Saya hanya mencoba menimbang sejauh mana masuk akal untuk melanjutkan dan menerapkan solusi yang disarankan @meverett atau menunggu ini.

Menerapkan ini melalui titik akhir HTTP adalah solusi yang rapi untuk versi yang sangat umum dari masalah ini, tetapi sepertinya berlebihan untuk banyak kasus penggunaan yang dijelaskan di sini (termasuk milik saya) di mana yang diperlukan hanyalah pemetaan statis dasar pada sejumlah sederhana "ramah nama tampilan" -> pasangan "nama basis data tidak ramah".

@svet-b fwiw, kami pindah untuk menggunakan saran @meverett dan itu tidak menyakitkan dan bersih. Hanya beberapa jam untuk membuat plugin sumber data.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Solusi @meverett bekerja cukup baik, tetapi gagal ketika digunakan dengan variabel multi-nilai karena seri hanya dapat diberi label dengan tag dari (dalam kasus saya) influxdb. Adakah saran untuk solusi di sana? :)

+1

+1

+1

+1

+1

Hai semuanya, karena masalah ini sering terbentur, saya memutuskan untuk memberikan contoh aplikasi web Node.js yang menggunakan solusi saya di atas .

Ini cukup mendasar, tetapi sepenuhnya mengimplementasikan pola yang saya sebutkan di komentar asli saya. Dan jika Anda bisa bertahan dengan memasukkan data pencarian Anda ke dalam satu file JSON yang tidak akan sering diperbarui, itu mungkin akan berhasil untuk Anda.

Jika tidak, Anda dapat menggunakannya sebagai titik awal dan memperluasnya untuk mengakses data alias dari sumber apa pun yang Anda inginkan (tentu saja diprogram oleh Anda) dan menyajikannya melalui aplikasi sedemikian rupa sehingga plugin sumber data SimpleJson dapat menggunakannya dan dapat digunakan untuk mendorong aliasing/pemetaan variabel template.

Repositori untuk contoh aplikasi web ada di sini .

Semoga membantu. Saya memiliki beberapa permintaan dari waktu ke waktu yang meminta bantuan/penjelasan lebih lanjut untuk menyiapkan solusi.

Bersulang

+1

+1

Terima kasih atas solusi darurat Anda, @meverett . Saya telah membuat repositori dengan Dockerfile untuk membuat wadah Docker untuk menjalankan solusi Anda. Ini diatur untuk mengambil data.json khusus dari samping Dockerfile saat dibuat. Semoga membantu orang:

https://github.com/shirakaba/GrafanaSimpleJsonValueMapper-docker

1

+1

+1

Ketika Anda ingin memberi ini +1, harap diingat bahwa Anda akan mengganggu 74 orang yang saat ini berlangganan masalah ini dan berharap seseorang untuk melangkah maju dan menerapkan perbaikan.
GitHub menambahkan reaksi karena suatu alasan...

+1

+1

+1

ini akan bagus! a memiliki daftar nilai numerik yang panjang tetapi harus jauh lebih baik untuk menunjukkan label yang ramah manusia untuk masing-masing nilai daripada nilai itu sendiri
variabel: myListOfLongs {nama: nilai toyota: 122321312332, nama: nilai renault: 6666666}

+1!

+1

+1
Setiap pembaruan tentang #11534 (Izinkan judul dinamis saat menggunakan panel/baris berulang)

+1

+111111

+1

+1

+1, Sangat membutuhkan fitur ini.

+1

+1

+1

+1

+1

Ini berfungsi untuk MySql dan PostgreSQL:

Opsi lainnya adalah kueri yang dapat membuat variabel kunci/nilai. Kueri harus mengembalikan dua kolom yang diberi nama __text dan __value. Nilai kolom __text harus unik (jika tidak unik maka nilai pertama yang digunakan). Opsi di dropdown akan memiliki teks dan nilai yang memungkinkan Anda memiliki nama ramah sebagai teks dan id sebagai nilainya. Contoh kueri dengan nama host sebagai teks dan id sebagai nilainya:

SELECT hostname AS __text, id AS __value FROM my_host

http://docs.grafana.org/features/datasources/mysql/#query -variable

Saya akan menyarankan variabel khusus menjadi:

[{
        "__text": "Server 1",
        "__value": 1
    },
    {
        "__text": "Server 2",
        "__value": 2
    }
]

Mungkin tipe baru bernama JSON?

Terima kasih @johnymachine! Itu bekerja dengan baik dengan sumber data PostgreSQL.

Sebagai perpanjangan dari ini, apakah ada cara untuk mengambil bagian variabel __text ? Ini akan sangat berguna untuk mengulang grafik.

Hai @MGinshe , ini berfungsi dengan baik (menampilkan teks menggunakan nilai) untuk saya:

image

EDIT: salah memahami konteks awal bug ini, abaikan komentar di bawah, itu lebih dimaksudkan untuk # 9292

@torkelo @nmaniwa

https://github.com/grafana/grafana/pull/12609 tampaknya menerapkan apa yang diminta kebanyakan orang di sini, ada alasan mengapa itu ditutup dan tidak pernah digabung?

Tidak, masalah itu tentang sesuatu yang sama sekali berbeda, atau apakah Anda menautkan ke masalah yang salah?

Masih belum ada kabar tentang ini? Ayo, kita di 2018!! Terima kasih!

@dmayan dijawab oleh @johnymachine . Anda dapat menggunakan ini.

Ini berfungsi untuk MySql dan PostgreSQL:

Opsi lainnya adalah kueri yang dapat membuat variabel kunci/nilai. Kueri harus mengembalikan dua kolom yang diberi nama __text dan __value. Nilai kolom __text harus unik (jika tidak unik maka nilai pertama yang digunakan). Opsi di dropdown akan memiliki teks dan nilai yang memungkinkan Anda memiliki nama ramah sebagai teks dan id sebagai nilainya. Contoh kueri dengan nama host sebagai teks dan id sebagai nilainya:

SELECT hostname AS __text, id AS __value FROM my_host

http://docs.grafana.org/features/datasources/mysql/#query -variable

Saya akan menyarankan variabel khusus menjadi:

[{
      "__text": "Server 1",
      "__value": 1
  },
  {
      "__text": "Server 2",
      "__value": 2
  }
]

Mungkin tipe baru bernama JSON?

Saya tidak menggunakan MySQL atau PostgreSQL. Ini harus menjadi fitur Grafana. Bukan
semacam peretasan.

Terima kasih!

El jue., 27 de sep. de 2018 05:52, Muhammad [email protected]
deskripsi:

@dmayan https://github.com/dmayan sudah dijawab. Anda dapat menggunakan ini.

Ini berfungsi untuk MySql dan PostgreSQL:

Opsi lainnya adalah kueri yang dapat membuat variabel kunci/nilai. Pertanyaan
harus mengembalikan dua kolom yang diberi nama __text dan __value. Teks
nilai kolom harus unik (jika tidak unik maka nilai pertama adalah
digunakan). Opsi di dropdown akan memiliki teks dan nilai yang memungkinkan
Anda memiliki nama yang ramah sebagai teks dan id sebagai nilainya. Sebuah contoh
kueri dengan nama host sebagai teks dan id sebagai nilainya:

PILIH hostname AS __text, id AS __value DARI my_host

http://docs.grafana.org/features/datasources/mysql/#query -variable

Saya akan menyarankan variabel khusus menjadi:

[{
"__text": "Server 1",
"__nilai": 1
},
{
"__text": "Server 2",
"__nilai": 2
}
]

Mungkin tipe baru bernama JSON?


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/grafana/grafana/issues/1032#issuecomment-425011676 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AWcYqEwxjXiXE07uM0ZG-A284TghEIR2ks5ufJG4gaJpZM4C4cjS
.

fitur yang cukup berguna, Jika fitur ini ada di luar sana, Ini bisa banyak membantu kami di sini. Karena grafit tidak dapat menyimpan karakter Cina. Jadi kami harus menggunakan bahasa Inggris di Graphite, tetapi kami sangat ingin menunjukkan bahasa Cina di dasbor grafana, sehingga pengalaman pengguna akan jauh lebih baik.

Semoga fitur ini segera terwujud.

Saya berhasil melakukan pemetaan ID->nama dengan menggunakan dua variabel. Variabel pertama mencantumkan semua kemungkinan ID (nilai) sedangkan variabel kedua mencantumkan nama (teks tampilan) yang cocok dengan ID. Ini bukan yang ideal atau cantik, tetapi berhasil.

Saya rasa itu disebut variabel bersarang . Dan kemudian Anda dapat menyembunyikan salah satu pemilih variabel.

+1

+1

@FdeFabricio Anda menggunakan InfluxDB? Apakah itu secara otomatis memperbarui satu nilai ketika mengubah yang lain? Jika demikian, bagaimana Anda melakukannya?

@bassie1995

Anda menggunakan InfluxDB?

Ya

Apakah itu secara otomatis memperbarui satu nilai ketika mengubah yang lain?

Ya

Jika demikian, bagaimana Anda melakukannya?

Anda membuat variabel jenis kueri yang memilih item yang cocok dengan nilai yang sudah dipilih (misalnya SELECT "name" FROM playlists WHERE ("id" =~ /^$playlist_id$/) . Jadi sekarang Anda akan memiliki dua variabel: satu dengan ID dan lainnya dengan nama.

@bassie1995 @FdeFabricio Anda juga bisa melakukan ini secara terbalik:

  • Variabel yang terlihat, yang memungkinkan Anda memilih nama daftar putar (yaitu Girl Power)
  • Variabel tersembunyi, yang menemukan ID daftar putar dari namanya (seperti SELECT "id" FROM playlists WHERE ("name" =~ /^$playlist_name$/) )

Dengan cara ini, pengguna Anda melihat opsi untuk memilih daftar putar berdasarkan namanya, tetapi ID daftar putar disembunyikan. Anda masih dapat mengakses ID daftar putar secara terprogram, untuk mencari item daftar putar, dll.

Sintaks __name dan __value dari sumber data PostgreSQL/MySQL masih ideal, karena mencegah ambiguitas id->nama, dan mengurangi jumlah kueri basis data yang diperlukan. Ini harus menjadi fitur dasar IMO.

Saya menemukan solusi lain berdasarkan komentar @johnymachine di atas. Ada dukungan untuk ini di beberapa sumber data. Jika tidak didukung di sumber data Anda, Anda dapat membuat database MySQL, menambahkan data di sana dan menulis kueri untuk mengembalikan __value dan __text. Ini berfungsi jika datanya statis, dalam keadaan kasus saya (keadaan geografis). Bagi siapa saja yang menginginkan fitur ini untuk variabel yang didefinisikan sebagai kustom maka saya pikir ini adalah solusi yang baik dan mungkin solusi yang lebih baik pula. Ini memungkinkan semua daftar variabel disimpan di 1 lokasi dan diubah dengan lebih mudah. Satu-satunya downside adalah membutuhkan menginstal MySQL.

PILIH SingleChar AS __value, ShortName AS __text DARI TSDB. State

Saya harus menambahkan solusi ini berfungsi untuk grafik berulang, baris berulang dan juga jika variabel memiliki multi-pilih. Contoh di atas menggunakan 2 variabel untuk menunjukkan "Girl Power" tidak berfungsi dalam situasi ini.

Saya hanya mengutak-atik masalah itu dan menemukan solusi yang agak hackinsh ...
Saya membutuhkan hash, yang dalam notasi Perl ditulis sebagai:
Perl %units = ( 'μSv/h' => 1.0, 'mrem/h' => 0.1 );
Saya membuat variabel dasbor Type : Custom , Values separated by comma : mrem/h, μSv/h dan kemudian mengedit JSON Model seperti itu:
JSON { "allValue": null, "current": { "tags": [], "text": "mrem/h", "value": "0.1" }, "hide": 0, "includeAll": false, "label": null, "multi": false, "name": "units", "options": [ { "selected": true, "text": "mrem/h", "value": "0.1" }, { "selected": false, "text": "μSv/h", "value": "1.0" } ], "query": "mrem/h, μSv/h", "skipUrlSync": false, "type": "custom" }

Meskipun ini berhasil (untuk beberapa waktu), mengedit dasbor melalui GUI mengubahnya kembali ke status tidak berfungsi :-|

Opsi lain untuk mengatasi ini jika Anda memiliki sistem lain yang dapat menyediakan data:

Gunakan plugin sumber data JSON, saya menggunakan: https://grafana.com/plugins/simpod-json-datasource

Terapkan hanya titik akhir pemeriksaan kesehatan / dan titik akhir /search di beberapa sistem yang memiliki data yang diperlukan. Titik akhir /search harus mengembalikan JSON yang terlihat seperti: [{ "text": "A Human Name", "value": "123456" }, ...] . Properti text akan menjadi apa yang muncul di tarik-turun pemilihan variabel dan value akan menjadi apa yang digunakan dalam kueri metrik.

Kemudian atur variabel dasbor Anda untuk melakukan kueri terhadap sumber data baru ini, ini agak meretas tetapi Anda dapat menggunakan bidang target untuk sumber data untuk memberi tahu backend apa yang harus dikembalikan jika Anda memiliki beberapa kumpulan data yang ingin Anda gunakan.

+1 ini. Saya sangat menginginkan cara untuk melakukan ini, tetapi cara yang tidak bergantung pada backend (kami menggunakan grafit).

+1 ada solusi yang berfungsi?

@BlackRider97 Silakan lihat komentar di atas - ada beberapa solusi yang berfungsi untuk PostgreSQL (dan mungkin MySQL, MSSQL, dll).

Solusi 1: https://github.com/grafana/grafana/issues/1032#issuecomment -409124505

Solusi 2: https://github.com/grafana/grafana/issues/1032#issuecomment -453242766

Menerapkan solusi dari @thinrope dengan benar akan menjadi perbaikan yang sangat elegan.
Jika kami dapat menggunakan JSON dalam variabel khusus, atau memiliki tipe variabel "JSON", kami dapat menyelesaikan ini tanpa peretasan dan saya tidak melihat kekurangannya.

+1 setiap pembaruan tentang ini?

+1

+1

Ini jelas merupakan fitur yang harus dimiliki.
Saya menggunakan variabel untuk memfilter beberapa host menggunakan regex pada nama host. Karena server saya memiliki pola dalam nama host, saya dapat memiliki regex untuk mendapatkan daftar semua server dari grup tertentu. Alih-alih menampilkan regexp yang jelek, saya ingin menampilkan nama yang cantik, seperti "Server grup A" sebagai label menu tarik-turun.

Cara memasukkan ini dalam nilai khusus bisa sesederhana:
label1:value1, value2, label3:value3, label5:value5

Label akan menjadi opsional. Jika : ada dalam string, maka semua yang sebelum : adalah labelnya dan semuanya setelahnya adalah nilainya.
Kita harus memiliki cara untuk menghindari : jika kita membutuhkannya dalam nama label atau nilai, seperti yang dapat kita lakukan untuk karakter , .

Opsi lain untuk mengatasi ini jika Anda memiliki sistem lain yang dapat menyediakan data:

Gunakan plugin sumber data JSON, saya menggunakan: https://grafana.com/plugins/simpod-json-datasource

Terapkan hanya titik akhir pemeriksaan kesehatan / dan titik akhir /search di beberapa sistem yang memiliki data yang diperlukan. Titik akhir /search harus mengembalikan JSON yang terlihat seperti: [{ "text": "A Human Name", "value": "123456" }, ...] . Properti text akan menjadi apa yang muncul di tarik-turun pemilihan variabel dan value akan menjadi apa yang digunakan dalam kueri metrik.

Kemudian atur variabel dasbor Anda untuk melakukan kueri terhadap sumber data baru ini, ini agak meretas tetapi Anda dapat menggunakan bidang target untuk sumber data untuk memberi tahu backend apa yang harus dikembalikan jika Anda memiliki beberapa kumpulan data yang ingin Anda gunakan.

Saya melakukan implementasi ini dan itu berhasil untuk saya, tetapi saya terjebak pada pelabelan tren (legenda) ... Saya mendapatkan id (angka) atau tidak ditentukan atau omong kosong lainnya.
Bisakah Anda memberi saran?

M

+1

Saya juga menggunakan sekarang JSON-hack yang dijelaskan oleh @ mbell697 di Grafana perusahaan saya. Tapi sepertinya ada masalah regex yang aneh IMHO.

Saya menyiapkan aplikasi labu python kecil yang memberi saya grup yang dibutuhkan untuk kueri Grafit seperti data pencarian saya

@app.route('/search', methods=['POST'])
def search():
    data = [
        {"text": "fs-servers", "value": "{FS-server-1,FS-server-2,FS-server-3}"},
        {"text": "db-a-servers", "value": "{db-server-1,}"},
        {"text": "db-b-servers", "value": "{db-server-2,db-server-3}"}
    ]
    return jsonify(data)

Jadi di dasbor saya membuat variabel kueri yang disebut "grup" menggunakan json-source dan kemudian mencoba memfilter grup "fs-servers" dengan bidang regex dengan menggunakan /fs-.*/ - tetapi ini tidak berfungsi seperti yang diharapkan - setelah mengutak-atik saya mengenali bahwa regex entah bagaimana diterapkan ke "nilai" - dan bukan ke bidang "teks". Adakah yang mungkin memiliki solusi atau ide?

+1

+1

Pendapat saya tentang persyaratan untuk ini:

Dalam kasus kami, saya memikirkan dua varian dari hal yang sama. Apa yang kita inginkan pada dasarnya adalah alias. Dalam kedua kasus tersebut, pemilik dasbor ingin memberi pengguna daftar variabel template yang mudah dipahami pengguna akhir. Namun nilai yang digunakan dalam kueri adalah nilai yang mendasarinya.

Contoh 1 - konversi nama satu ke satu yang sederhana. Jadi dalam hal ini kami memiliki kode negara numerik yang diterbitkan sebagai nilai metrik. Tapi ketahuilah seseorang menghafal kode numerik. Jadi kami ingin menampilkan "AS" atau "Kanada"

{ "KAMI" == "01" }
{ "Kanada" == "02" }

Jika "Kanada" dipilih, nilai variabel templat yang diteruskan ke kueri apa pun adalah "02"

Contoh 2 - adalah pemetaan satu ke banyak. Secara internal kami memiliki tahapan untuk penyebaran, misalnya s0, s1, s2, s3, s4. Namun pengguna akhir dapat menggunakan ini sebagai "dev, beta, prod"
Jadi mereka ingin memetakannya sebagai:

{ "dev" == ["s1"] }
{ "beta" == ["s2", "s3"] }
{ "prod" == ["s4", "s5", "s6"] } atau lebih baik lagi "prod" == s[456]

Jadi jika "prod" dipilih "s4,s5,s6" diteruskan ke kueri

Dari perspektif kueri (mengambil Contoh 2) di mana nama variabelnya adalah stageVar
dan nama tag metrik adalah panggung:

Kami tidak melihat begitu banyak kebutuhan untuk aliasBy() seperti panggilan tetapi lebih banyak hal seperti:
tahap=~${tahapVar. nilai:regex }
alias($stageVar.label)

Untuk memfilter hasil menurut nilai variabel template yang dipilih. Sangat mungkin bahwa seseorang mungkin mencoba dan menggunakannya dalam sesuatu seperti fungsi aliasBy() tetapi jika itu adalah kesalahan sintaks yang baik-baik saja. Saya tidak mengharapkan Anda untuk secara ajaib memperbaiki konversi array yang diteruskan ke fungsi yang mengharapkan nilai tunggal.

Adapun pemetaan, saya pikir meminta pengguna mendefinisikannya secara statis sudah cukup.
Idealnya Anda akan memiliki permintaan ke MT untuk mendapatkan daftar nilai yang perlu dipetakan, untuk Anda, misalnya "01", "02", "03" dan kemudian Anda akan dengan mudah menambahkan pemetaan/alias. Nilai yang tidak dipetakan akan masuk ke keranjang "default".

+1

+1

Saya sangat terkejut ini belum dimasukkan - saya menghabiskan cukup banyak waktu mencoba mencari tahu bagaimana hal "jelas" ini dan akhirnya menemukan jalan saya di sini untuk menemukan itu tidak ada.

Kemampuan untuk menulis ulang secara dinamis seperti yang dijelaskan oleh beberapa orang di atas akan menjadi luar biasa. Namun, saya bahkan akan senang dengan peretasan jangka pendek (atau model "mudah" permanen) yang merupakan versi tambahan dari bidang "Kustom", yang secara statis memetakan pilihan ke hasil pilihan tunggal atau ganda.

Contoh kami adalah kode negara. Kita sering ingin melihat kelompok sistem berdasarkan wilayah geografis, tetapi tidak berdasarkan negara. Tapi kami hanya menyimpan kode negara sebagai kunci di server Prometheus kami. Jadi sekarang, jika saya ingin melihat semua sistem di Amerika Utara, saya harus memilih AS, CA, MX secara manual dari daftar opsi berbasis Kueri dari hampir 100 negara. Saya bahkan tidak dapat memberi tahu Anda berapa banyak waktu yang saya habiskan untuk memilih setiap negara di Eropa, atau Asia, atau Afrika untuk melakukan analisis. Hampir layak untuk menyiapkan dasbor yang sama sekali berbeda untuk setiap wilayah, yang tidak masuk akal tetapi merupakan satu-satunya cara untuk memecahkan masalah kekurangan grafik pengkodean keras. Membuat database yang sama sekali baru dengan pemetaan dan kemudian melakukan kueri tersembunyi tampaknya juga sangat, sangat jauh dari ideal.

Mimpi demam saya:
Tampaknya ini akan menjadi opsi "Daftar Kustom" sebagai kemungkinan jenis Variabel baru. Daftar Kustom akan mulai kosong jika dipilih, tetapi akan terlihat sangat mirip dengan model "Kustom" yang terlihat hari ini. Tombol "Tambah" akan muncul. Mengklik "Tambah" akan membuat larik input dua bidang dengan "Nilai Tampilan:" dan "Nilai Pencarian:" di mana masing-masing dapat diisi. "Nilai Tampilan" akan menjadi apa pun yang ingin ditampilkan pengguna di daftar pilihan - di kami kasus, "Amerika Utara". Kemudian "Nilai Pencarian" akan menjadi apa yang akan disajikan dalam kueri - sekali lagi, dalam contoh ini untuk Amerika Utara akan menjadi "us,ca,mx". Setiap saat, ikon "hapus" (tempat sampah?) akan membuat setiap baris menjauh. Mengklik tombol "Tambah" lagi akan membuat pasangan baru, sampai pengguna menyelesaikan daftar opsi mereka. Opsi "Multi-Nilai" dan "Pilih semua" akan tetap ada, mirip dengan model Kustom yang ada.

Saya sangat terkejut ini belum dimasukkan - saya menghabiskan cukup banyak waktu mencoba mencari tahu bagaimana hal "jelas" ini dan akhirnya menemukan jalan saya di sini untuk menemukan itu tidak ada.

Saya telah memecahkan ini dengan membuat database MySQL, saya membuat tabel dengan item yang saya inginkan di dropdown, misalnya Eropa, Amerika Utara dll. Di bidang kedua saya memiliki regex yang akan cocok dengan entri yang ingin saya cocokkan. Kemudian tambahkan MySQL sebagai sumber data dan gunakan untuk membuat variabel. Ini adalah peretasan tetapi sebenarnya berfungsi dengan baik. Saya menggunakannya untuk hal yang persis seperti yang Anda coba lakukan.

Saya menghargai peretasan yang cerdas, tetapi bagi kami itu bukan solusi. Menyiapkan database yang sama sekali baru (kami tidak menggunakan MySQL sama sekali, yang berarti secara operasional ini tidak mungkin) untuk melakukan substitusi kunci/nilai sederhana yang cukup statis sepertinya banyak rintangan yang harus dilewati.

Saya lebih memikirkan hal ini, dan ada cara yang lebih elegan untuk menyediakan fungsionalitas ini daripada yang saya jelaskan di atas. Saya akan menyebutnya "makro variabel". Ini sekali lagi terlihat seperti daftar Kustom, kecuali memungkinkan administrator untuk menentukan bahwa ketika satu (atau lebih) makro ini dipilih, maka Variabel bernama akan ditetapkan, dan Nilai yang diberikan akan ditambahkan ke kumpulan nilai yang ada. Ini sepenuhnya akan menjadi model berbasis UI, dan tidak akan mengubah konsep variabel aktual sama sekali - itu hanya akan membuat lapisan gula pelengkapan otomatis di atas variabel yang ada. Ini membuatnya kompatibel mundur tanpa variabel tambahan yang diperlukan untuk pembuatan atau integrasi ke dalam kueri.

Makro yang mengatur variabel akan memungkinkan pengguna untuk melihat nilai saat mereka dipilih, dan kemudian akan memungkinkan pengguna untuk membuka setiap variabel dan melihat/memanipulasi pilihan atau data alih-alih membuat variabel terpisah seperti komentar saya sebelumnya berarti. Ini akan jauh lebih intuitif.

Contoh:

Jadi makro variabel yang disebut "Amerika Utara - Klaster Utama" akan mengatur variabel "Negara" saya menjadi "us,ca,mx" dan akan mengatur variabel "Cluster:" saya menjadi "primer". Pengaturan itu akan terlihat jika saya menarik setiap variabel bernama (atau tidak, jika disembunyikan) sehingga saya dapat menambah atau mengurangi negara ke daftar Negara: selama saya tidak menyentuh pulldown variabel Makro lagi.

Mungkin ada boolean "hapus variabel bernama sebelum pengaturan" sehingga jika perubahan dibuat dalam daftar pilihan untuk Makro ini, maka pengaturan lain dari variabel yang ditentukan akan dihapus. Ini bisa berguna untuk daftar di mana tidak jelas bahwa Anda mungkin menyertakan sesuatu yang telah ditetapkan sebelumnya. Saya kira jika lebih dari satu opsi Makro Variabel dipilih, maka opsi terakhir dalam daftar yang akan diperiksa "menang" jika ada pengaturan bersaing dari nilai tertentu; tidak ada jalan keluar dari masalah itu. (dapat diperdebatkan bahwa tindakan kliring ini harus ditentukan berdasarkan variabel demi variabel, tetapi itu tampaknya terdengar sedikit berantakan ... tapi benarkah?)

Inilah contoh hipotetis saya lagi, di mana saya memiliki variabel "Negara" dan "Cluster" yang sudah ada sebelumnya.

Nama Makro Variabel: Wilayah

Name1: Amerika Utara - Klaster Utama
Hapus variabel Bernama sebelum pengaturan: Y
Variabel1: Negara
Nilai1: kami, ca, mx
Variabel2: Cluster
Nilai2: utama

Name2: Nordik - Cluster Sekunder
Hapus variabel Bernama sebelum pengaturan: Y
Variabel1: Negara
Nilai1: se,fi,no,dk,is
Variabel2: Cluster
Nilai2: sekunder

Saya menghargai peretasan yang cerdas, tetapi bagi kami itu bukan solusi. Menyiapkan database yang sama sekali baru (kami tidak menggunakan MySQL sama sekali, yang berarti secara operasional ini tidak mungkin) untuk melakukan substitusi kunci/nilai sederhana yang cukup statis sepertinya banyak rintangan yang harus dilewati.

Saya mengharapkan Anda akan mengatakan sesuatu seperti ini. Kenyataannya adalah Anda meminta peretasan dan peretasan ini menyelesaikan masalah, tidak sulit untuk mengaturnya dan tidak sulit untuk membalikkannya di masa mendatang. Saya sebenarnya merasa cukup berguna memiliki MySQL di sana karena kami terus menambahkan set data baru ke dalamnya, ini adalah tempat yang nyaman untuk melacak dan memperbaruinya. Jika Anda memikirkannya, jika Anda akan menggunakan kumpulan data ini di beberapa dasbor dan ingin mempertahankannya secara terpusat, maka data tersebut perlu disimpan di suatu tempat. Jika basis data deret waktu Anda tidak dapat menyimpannya, maka Anda memerlukan pengaturan sesuatu untuk menyimpannya. Jadi sebenarnya masuk akal untuk memiliki MySQL. Bonus tambahannya juga sangat mudah untuk mengotomatisasi populasi MySQL.

Jika Anda memiliki PostgreSQL, Anda tidak perlu membuat tabel aktual untuk pemetaan, Anda dapat melakukan sesuatu seperti:

SELECT *
FROM
(
    VALUES
        ('London server 1', 'london_srv_1'),
        ('London server 2', 'london_srv_2'),
        ('New York server 1', 'ny_srv_1'),
        ('New York server 2', 'ny_srv_2')
) AS t (__text, __value)

Tapi itu tidak bekerja dengan nilai numerik:

PILIH * DARI ( NILAI ( 'OK', '0'), ( 'ERROR', '1') ) AS t (__text, __value)

Saat memuat dasbor:

imagen

Dan ketika memilih parameter lain

imagen

Saat memilih: OK + ERROR

imagen

Jika Anda menginginkan nilai numerik, Anda harus menghapus tanda kutip tunggal, jika tidak maka akan ditafsirkan sebagai teks, mis

SELECT * FROM ( VALUES ( 'OK', 0), ( 'ERROR', 1) ) AS t (__text, __value)

Terima kasih @GlennMatthys glenn atas jawabannya, tetapi saya sudah menemukan di mana masalah terjadi.

PILIH * DARI ( NILAI ( 'OK', 0), ( 'Peringatan', 1), ('Kritis', 2) ) AS t (__teks, __nilai)

Mengonfigurasi Multi-nilai pada:

imagen

Itu terjadi
imagen

Memilih 3 negara bagian
imagen

Dan Multi-nilai mati:

imagen

GlennMatthys - solusi Anda sempurna, terima kasih banyak

Untuk MySQL-nya:
SELECT * FROM ( VALUES row('a', 1), row('b', 2) ) AS t (__text, __value)

Bagaimana dengan Mariadb? Itu tidak berfungsi untuk saya (versi mariaDB: 10.5.5)

SELECT * FROM ( VALUES row('a', 1), row('b', 2) ) AS t (__text, __value);
ERROR 1064 (42000)..............

Atau yang sebelumnya:

SELECT * FROM ( VALUES ( 'OK', 0), ( 'Warning', 1), ('Critical', 2) ) AS t (__text, __value);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your 
MariaDB server version for the right syntax to use near '(__text, __value)' at line 1

Sepertinya pernyataan Nilai tidak lagi tersedia...

Atau ada hal lain yang saya lakukan salah?

@radoeka Untuk MariaDB/MySQL yang lebih lama

SELECT * FROM
(
    SELECT 'London server 1' AS '__text', 'london_srv_1' AS '__value'
    UNION ALL SELECT 'London server 2', 'london_srv_2'
    UNION ALL SELECT 'New York server 1', 'ny_srv_1'
    UNION ALL SELECT 'New York server 2', 'ny_srv_2'
) AS t;

@GlennMatthys wow wow wow, respon yang cepat! Dan ini berhasil.
Saya pikir saya menjalankan versi mariadb yang agak baru, tetapi itu tidak terjadi (menggunakan distribusi linux yang baru berusia 2 bulan).
Terima kasih.

Ini tampaknya tidak didukung untuk Prometheus.

Membuka kembali masalah ini karena #27829 hanya menyelesaikan ini untuk data statis.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat