Coder Social home page Coder Social logo

meerkat-dashboard / meerkat Goto Github PK

View Code? Open in Web Editor NEW
18.0 2.0 2.0 2.11 MB

Drag-and-drop dashboards for Icinga

Home Page: https://meerkat.run

License: GNU Affero General Public License v3.0

Go 35.16% Shell 3.76% JavaScript 46.89% Dockerfile 0.15% Python 14.05%
dashboard icinga icinga2 monitoring

meerkat's Introduction

Meerkat

pkgsite

Meerkat is a utility to create and share dashboards for Icinga 2 checks and hosts. It is comprised of a lightweight Go server and a browser front-end written in Preact. It's quick to setup and easy to use.

Not developing Meerkat? See the Meerkat website at https://meerkat.run

Getting started

To install and setup Meerkat locally follow these steps.

Installation

  1. Download the installation script and make executable.
cd /tmp
wget https://github.com/meerkat-dashboard/meerkat/raw/main/contrib/download-install-latest-release.sh
chmod +x download-install-latest-release.sh
  1. Run setup script.
Usage: download-install-latest-release.sh --port PORT --user USER [--label LABEL] [--cert-name CERT_NAME] [--release-url RELEASE_URL]
  --user        User for the meerkat instance
  --port        Port for the meerkat instance
  --label       Unique label for the meerkat instance under /usr/local/meerkat
  --cert-name   Name for the SSL certificate
  --release-url URL of the meerkat release to download from GitHub
Standard installation
sudo ./download-install-latest-release.sh --port 8080 --user meerkat
Multiple Meerkat installation

The below would install meerkat to different directories and run it on different ports.

sudo ./download-install-latest-release.sh --port 8080 --user meerkat --label foo
sudo ./download-install-latest-release.sh --port 8081 --user meerkat --label bar

These will have different configuration files, install directories and service name based on the label. Service Name: meerkat-foo, meerkat-bar Config: /etc/meerkat-foo.toml, /etc/meerkat-bar.toml Install Directory: /usr/local/meerkat-foo/, /usr/local/meerkat-bar/

Configuration

To configure Meerkat you must edit the meerkat.toml config file (Default location is /etc/meerkat.toml)

# The address, in host:port format, to serve meerkat from. For example 0.0.0.0:8080. 
# The default is “:8080” i.e. all IPv4, IPv6 addresses port 8080.
HTTPAddr = "0.0.0.0:8080"

# The URL for an instance of Icinga serving the Icinga API
IcingaURL = "https://127.0.0.1:5665"

# The username and password with which to authenticate to Icinga. 
# Normally set in /etc/icinga2/conf.d/api-users.conf on your Icinga2 master.
IcingaUsername = "meerkat"
IcingaPassword = "YOUR SECURE PASSWORD HERE"

# If IcingaInsecureTLS to true, verification of the TLS certificates served by the Icinga API is skipped. 
# This is usually required when Icinga is configured with self-signed certificates.
#IcingaInsecureTLS = true

# If events havent been received for the value of IcingaEventTimeout in seconds then resubscribe to the event stream.
IcingaEventTimeout = 30

# If SSLEnable to true, meerkat will serve data over http2 using the crt and key.
# A ssl cert and key is required if you enable ssl.
# This option is required for multiple dashboards to function, Meerkat uses eventstreams which are limited in http1, http2 has a higher limit.
SSLEnable = true
SSLCert = ""
SSLKey = ""

# If LogFile is true, meerkat will log to file.
LogFile = true
# If LogConsole is true, meerkat will log to console.
LogConsole = false
# Path to folder to store log files. 
LogDirectory = "log/"

# If IcingaDebug set to true meerkat will output icinga api debug information.
IcingaDebug = false

Development

Meerkat development requires supported releases of Go and Node.js. See the Go installation and Node.js install documentation. Devolopment with older toolchains may be ok but we can't guarantee the behaviour.

Quickstart

A typical workflow involves starting a filesystem watcher to rebuild the UI on changes:

cd ui
npm run dev

Then run another command to start meerkat with go run:

go run ./cmd/meerkat -ui ui

The ui flag sets meerkat to serve the UI bundle from the ui directory. This means subsequent changes to the UI will be served without requiring a rebuild of the entire command.

For more detail on each stage, keep reading.

Development workflow

Another workflow involves running local test suites, then building and running the program for manual testing.

As before, start by installing javascript dependencies:

cd ui
npm ci

Throughout development, tests can be run via go test. This includes Javascript tests. To run all tests:

go test ./...

Finally, build the UI and the server and run meerkat:

cd ui
npm run build
cd ../cmd/meerkat
go build
./meerkat

By default, meerkat listens on the address http://127.0.0.1:8080. Open meerkat and have a click around!

For command usage, see cmd/meerkat. For a configuration file reference, see Configuration.

Contributing

Test

Before submitting a change, ensure code is formatted:

go fmt
cd ui
npm run lint

Run all the tests from the root of the project:

go test ./...

Commit message

Commit messages follow the same format used by the Go project (among others). The commit subject starts with the affected package name then a brief description of the change. The body may contain an explanation of the change and why it was made. See commit 4603601 for an example.

Configuring Icinga

Meerkat communicates with Icinga via its HTTP API. This requires authentication. Here is an example ApiUser object with limited, read-only privileges:

object ApiUser "meerkat" {
	password = "meerkat"
	permissions = [ "objects/query/Host", "objects/query/Service", "objects/query/ServiceGroup", "objects/query/HostGroup", "events/StateChange" , "events/CheckResult", "events/AcknowledgementSet", "events/AcknowledgementCleared", "status/query" ]	
}

In a default Icinga2 installation, you can write this definition to /etc/icinga2/conf.d/api-users.conf.

Support

Sol1 is an official Icinga Enterprise Partner, and can offer commercial support for Meerkat and Icinga and friends. We are a friendly bunch of people, so please don't hesitate to get in touch at https://sol1.com.au.

Contributing

We welcome any contributions. Let us know via the issues here if there is something you need fixed up, or even better, a patch or PR would be most appreciated.

Sounds from Notification Sounds provided under the creative commons 4.0 license

License is GNU Affero GPLv3.

meerkat's People

Contributors

63 avatar afoster avatar davekempe avatar jchansol1 avatar khoan avatar maxsol1 avatar mpalmer avatar ollytom avatar s2156945 avatar sol1-matt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

n2lose ollytom

meerkat's Issues

Feature: Merkat templates

In GitLab by @matthew on Jan 20, 2021, 14:17

Summary

Create a meerkat template that allows you to pass in a variable that changes the which checks are shown in the diagram.
To be used where 100's of diagrams are needed that look identical but return the results based on a variable : eg all services from a given host.

Elements

1 diagram background per template

Each template would have a single diagram background

Consistent view url

Likely to already be done but the url to the template should be consistent so other automated systems can create links using the variables.

example from icinga shared navigation: name = Live diagram, url = http://meerkat.example.com/view/templateid?hostname=$host.name$

http://meerkat.example.com/view/templateid?hostname= is the part that should be consistent

$key$ is icingaweb2's format for variables.

Controlable template url name/id (optional)

Being able to control templateid may be of use too. Meerkat dashboards are built for existing systems, rather than have to customize each url on a per template basis for system linking to meerkat allowing the meerkat template url to be controlled opens the possibility for systems to have a single entry covering all systems and templates (over multiple meerkat templates).

Example icinga hosts that has a $host.var.projectname$ variable that is imported from elsewhere.

The icinga url becomes http://meerkat.example.com/view/$host.var.projectname$?hostname=$host.name$.

New array of defined variables

The meerkat url will take paramaters that can be used as variables in checks.

These variables should be predefined in an array of allowed variable names per template

example meerkat url: http://meerkat.example.com/view/templateid?hostname=ikus_headends_tab-0009e3100309

New checks added to the diagram can use a variables

When adding checks to the diagram instead of selecting the specific check require the user will be able to select the an

object type filtered by the predefined variables above.

example input for url: http://icinga-tsr.sky.net.local/icingaweb2/monitoring/host/show?host={hostname}

Provide a "what matches" pop-up for host and service filters

In GitLab by @matthew.palmer on Oct 10, 2020, 13:32

Icinga filters are somewhat fiddly, and it can sometimes be hard to figure out exactly what a given filter will match. It would be useful if there was a button next to the host/service filter <input> element which ran the filter string currently in the box against the backend Icinga, and listed what hosts or services will match the filter (perhaps optionally with each object's status?). That way users can "test" a filter before they commit to it, and also make sure they're not matching something they didn't want to (which could have disastrous consequences for dashboard accuracy).

Support alert sounds that are played when the state of the checks changes

In GitLab by @max1 on Sep 28, 2020, 12:23

We need to have alert sounds that can be uploaded and attached to a particular element that will sound when a check changes status.

This will involve uploading the sound via an upload form from the frontend processing it in the backend and storing it in the repo alongside the other assets.

Provide help for Icinga filter syntax

In GitLab by @matthew.palmer on Oct 10, 2020, 13:34

Some sort of little icon next to the filter <input> element which, when clicked, provided a pop-up with our best guess of what Icinga API filter syntax actually was, would be very handy. It's a weird sort of language, and bears absolutely zero resemblance to what people who've only dealt with the Icinga web API before would expect.

Support Perfdata values as Card contents in checks

The card feature needs to support perfdata. The perfdata output is key=value pairs, and when configuring a host or service check, the card element type should allow the user to pick the type of perfdata from that check (say 'packet_loss') and then when displayed, the card will show the value of the perfdata. EG - new card, service, ping google, contents is perfdata - pick packetloss. Save element, and packet loss value to google is showed on diagram.

HLS and audio streams need to support a proxy

We may need to get streams from a proxy off the internet, so the video and audio types need to support having a proxy config text input which then gets passed to the video player

Add option for "All services on a host" in dropdown

This is a new API call, but will require a list of all services on a host from the API, then you can put the host in the search box. This will create an Icinga element that has the "worst" service on the host out of all the services.

Implement 2 stage filtering for hosts/services/hostgroups/servicegroups

When selecting Icinga Elements, it would make more sense to have a 2 stage selection, where you first select the Object Type - like Host, HostGroup, Service or ServiceGroup. And then the second dropdown lets you select from a list of the first time, so a list of hosts for example. This way we can cut down the size of the list and make it more targeted.

Implement "Ticker" Element With Options

In GitLab by @max1 on May 21, 2021, 17:10

We need a new type of element which is basically like those info graphics you see at the bottom of a news program.

ticker

Don't use the marquee html tag as its deprecated in HTML5.

This will need a text input box that contains the Ticker text to be scrolled.
Also a colour option would be nice for both text and background (maybe height also).
Scroll direction should be left to right. It can be pinned to the bottom of the dashboard (Bonus points for making it a movable element).

"Stroke" is kinda weird

maybe call it "outline" or "outline colour"
For the others "$STATE Fill Colour" might make a little more sense

image

Consider embedding the background image in the dashboard JSON

In GitLab by @matthew.palmer on Oct 19, 2020, 10:44

This may seem, on the face of it, to be a deranged thing to do, but hear me out.

At the moment, a dashboard consists of two "main" data items: (1) the JSON description of the elements (what they are, where they live, their parameters, etc), and (2) the background image. They are stored separately on disk (in entirely separate directories, even), and are not related to each other except by a reference in the dashboard JSON to the (content-encoded) filename of the image.

For various reasons, this offends my aesthetic sensibilities.

Firstly, if you delete a dashboard JSON file, the background image isn't necessarily deleted, and once the dashboard JSON is gone, there's no way to ever know what its background image was (so cleaning it up later is a matter of enumerating all the other dashboards, listing their background images, and then deleting the image file(s) that aren't listed -- eeeeugh!). A similar problem ("orphaned" dashboard backgrounds) can happen if you create a new dashboard, upload a background image, and then don't save the dashboard.

Secondly, when you want to retrieve a dashboard, you need to make two requests: first, one for the JSON dashboard description, and then a second for the background image. These can't be made in parallel, because you need to read and parse the dashboard description to find out what image filename you need.

Finally, and the thing which made me think this might be entirely an unhinged idea, is that Narwhal will be incorporating Meerkat dashboards, and the most likely approach to do that will be to request the dashboard JSON directly from Meerkat, and render it within Narwhal. This is a neat idea, but that'll likely require Narwhal proxying Meerkat requests from the user, and it'll simplify the proxy implementation if there's fewer requests that need to be proxied.

So, my recommendation is for dashboard background images to be base64-encoded, jammed into the dashboard JSON, and uploaded as a single unit to Meerkat.

Here endeth the sermon.

Support Acknowledged states

We need to be able to support the acknowledged state on services and hosts. The simple solution is to apply a lighter overlay in CSS to the current state.
Something like where critical + acknowledged is received, apply a white tone to make the red into a pink.
And so on for warning + ack and unknown + ack.
It needs to be light enough to be clear it is a different colour.

The sky racing dashboard in nagvis is an example of how we used to do it:

image

Need ability to add Hostgroups and ServiceGroups

We have customers have use these and need to be able to source them from the API and use them in checks.
The state of the worst group member needs to set the state for the whole group. Of course that means that if 1 thing goes red, the whole icon goes red, and a second thing won't make it more red. Which is fine.

Hover / Pop-up text

In GitLab by @woody on Apr 12, 2021, 16:20

Some checks would benefit from some more detail, this could come from an Icinga help text field which is maybe populated from Netbox / Director whatever.

e.g. for TBS the BOC operators would have instructions or details from Netbox such as who to call and what DVN services are involved etc.

On a more general use it might just be useful to bring up the list of icinga services, one per line, in order of criticality.

Servicegroups ack state isn't displaying

Need to get the worst state of the service group, and make ACK the second worst state.
So - green if ALL OK
Hard red if any CRITICAL and unacknowledged
Soft RED (ACK) if critical but acknowledged.

Unacked beats acked.

Ability to clone Elements

its a bit of messing about selecting UI elements and setting all their states each time
a clone button so we can copy the one we set up and paste it again to just change the name would be good

Lines get eaten

If you add an Icinga Line object, it seems to save OK, and then when you view the dashboard it disappears.

View doesn't match up now the stretch is turned off

The elements are moved off their background position when in view mode after the stretch was turned off. I think this is to do with where they are placed in x,y land. It would be easy enough to have the edit mode have the picture start at 0,0 as well, then the background and elements would match in both modes.

Clone (duplicate) a dashboard

In GitLab by @max1 on May 3, 2021, 11:18

Need to be able to clone a dashboard, i'm thinking this will be on the home screen next to the delete button. after cloning it will create a new dashboard with the file name plus "copy" then "copy 2" etc

Add a clickable URL in view mode

Allow elements to be linkable in view mode to other web pages. Needs a UI in editing an element for URL, and a hyperlink added to to the element for view mode. Doesn't need to apply to all elements, like video and audio, just the icons and cards.

Meerkat Performance with many checks and dashboards

We are quickly going to exhaust the CPU of the Icinga server unless we do something drastic (like switch to the Event API).
The current logs are filled with requests like this:

[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49224)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49226)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49222)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49228)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49230)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:25215)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49234)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49236)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49238)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49240)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49242)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49244)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49246)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49248)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49250)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:25216)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49254)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49256)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:25217)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:25218)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49266)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49262)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49264)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49270)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:25219)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49272)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49276)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49274)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection have been received in the last 10 seconds.
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: HTTP client disconnected (from [10.99.99.90]:49278)
[2021-03-19 01:49:31 +0000] information/HttpServerConnection: No messages for HTTP connection

Meerkat Authentication plan

Meerkat needs authentication for some purposes, while still being able to support viewable URLs easily for monitors on walls etc.
The current plan is as follows:

  • Single admin user for editing maps configured in config file, plain text is OK
  • Userlogin is prompted and enforced for home page (list of diagrams)
  • Each diagram has a token generated for it which is appended automatically in the view list on the front page.
  • The view links are only viewable with the generated token appended to the URL.
  • Editing is only available via logging into the web UI with the admin username and password.
  • In the advanced view of a diagram, you should be able to see the token, and regenerate it if required.

This along with having an IcingaAPI user with read only rights, should provide a decent balance of security and usability. Yes its possible to leak/share read only versions of the maps with whoever can reach the meerkat server, however given that meerkat has no ability to make changes this should be acceptable. We can expand on this model later on if we need more fine grained control.

Default URL for elements

In GitLab by @woody on Apr 12, 2021, 16:23

Quite often the URL required is pretty obvious based on the config of the check, e.g. if the checkbox is for a service group then link to that service group in icinga.

This could maybe be a radio button arrangement, e.g. No link, dashboard view, list view, custom, other meerkat dashboard, or custom (e.g. to device)

Select elements by clicking on them in Edit window

In GitLab by @matthew on Apr 13, 2021, 16:38

If a dashboard has many elements it can be difficult to figure out the name of the element you want to change, but it is easy to see it's position on the dashboard.

You should be able to select a element by clicking on the element on the dashboard (that you know the position of) instead of trying to figure out what the right name is.

Doubly so if you didn't originally set the dashboard up and don't know what the name is, the names are a host mess or it has been a while since you've worked on the dashboard.

Don't submit filter search results on every keystroke

In GitLab by @matthew.palmer on Oct 10, 2020, 13:30

When editing an element which uses a host or service filter to select which object('s|s') status to use, the <input> element for the filter currently uses an onChange handler to update the filter parameter. This has the unpleasant side-effect of updating the element's display in the preview pane on every keystroke, so as you're typing in a filter specification, the element "flickers" as the filter spec currently in the box changes between valid and invalid. This is ugly. Need to figure out which event handler is more appropriate than onChange, so that the filter only actually updates when the <input> loses focus, or perhaps when Enter is pressed, or... something.

Check cards losing css styles on print to PDF

In GitLab by @max1 on May 10, 2021, 11:21

Could possibly just add media="print" to the style sheet:
<link rel="stylesheet" src="print.css" type="text/css" media="print" />

Media query for print (which should work for the PDF print):

@media print { .check-card.ok: background-colour: green }

This is a screenshot from a pdf document where the styles for the check card aren't displaying:
Screen_Shot_2021-05-10_at_10.58.11_am

What does this element mean in english?

In GitLab by @woody on Apr 12, 2021, 16:16

As a documentation feature and for usability it would be great to store with each element a sentence which could be displayed on hover which gives some meaning to the element, to enhance their understanding of what the "Green" or "Red" means.

examples:
"The Audio sources originating at Ultimo all have status OK on all the A muxes"

The title could be used for this but the title could maybe be shorter for other reasons.

Bonus feature, if this is blank, then generate something from the Icinga check config, e.g. "Service group Ultimo Audio A"

New Card type: Dynamic text - sourced from host vars

It would be handy to have the dashboard be able to display host variables dynamically. So the creator of the dashboard can pick a new type of card - Dynamic text, and this then prompts them to pick the host, then the host variable for the contents of the card. Formatting can be applied just like static text.

This will work well with templates, but even for static dashboards, it will be handy to not have to repeat ourselves for things like site address or serial numbers.

Duplicate Element Service Issue

In GitLab by @max1 on Sep 22, 2020, 14:14

When an element is duplicated and the duplicated item has it's service changed, it changes the source duplicated one as well

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.