Can Kibana serve static HTML files?

I'd like to front-end a set of related Kibana dashboards with a static web page that displays a set of tiles with links to those dashboards:

This is just a skeleton layout:

  • The color and sizing specs are temporary placeholder values
  • The top-left tile is a "title/heading" tile for the set of dashboards
  • In practice, the "Dashboardn" text would likely be a Dashboard title followed by a short blurb. (Ideally, I'd like to programmatically populate this grid by querying the kibana index for dashboard saved objects, filtered by tag name, but that's another topic...)

I acknowledge that this is really just a custom version of the dashboard list page already provided by Kibana. I want "tiles", okay?

Rather than hosting this page using a separate HTTP server, I'd like to be able to simply copy the HTML file to a folder that is already served by Kibana. Is there such a folder in Kibana where I can copy static assets to be served? And, if so, what is the URL path?

I've used Developer Tools in my browser and seen what look to me like requests to static URLs, and I could go hunting around in the Kibana folders for those locations, but I'd prefer to know whether there's a folder for this particular use, rather than opportunistically copying the file to some place I really shouldn't.

For what it's worth, here's my rudimentary skeleton HTML for such a page:

<html>
<head>
<style>
html, body {
    height: 100%;
    margin: 0;
    font-family: sans-serif;
    background-color: #FFCCCC;
}
ul {
    list-style-type: none;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
    grid-auto-rows: 1fr;
    padding: 0;
    height: 100%;
}
li {
    color: #FFFFFF;
    margin: 0.5rem;
    padding: 0;
}
a {
    display: flex;
    justify-content: center;
    align-items: center;
    color: #FFFFFF;
    width: 100%;
    height: 100%;
    text-decoration: none;
}
a:hover {
    background-color: #6666CC;
}
li:nth-child(4n) {
    background-color: #008800;
}
li:nth-child(4n+1) {
    background-color: #009900;
}
li:nth-child(4n+2) {
    background-color: #00AA00;
}
li:nth-child(4n+3) {
    background-color: #00CC00;
}
li:nth-child(1) {
    background-color: #000000;
    display: flex;
    justify-content: center;
    align-items: center;
    color: #FFFFFF;
    flex-direction: column;
    font-size: x-large;
    font-weight: bold;
    text-align: center;
}
li:nth-child(1) img {
    position: relative;
    display: block;
    width: 15rem;
    margin-bottom: 1em;
}
</style>
</head>
<body>
<div>
<ul>
<li><img src="data:image/svg+xml,%3Csvg ..."/>Heading</li>
<li><a href="/app/dashboards#/view/...">Dashboard1</a></li>
<li><a href="/app/dashboards#/view/...">Dashboard2</a></li>
<li><a href="/app/dashboards#/view/...">Dashboard3</a></li>
<li><a href="/app/dashboards#/view/...">Dashboard4</a></li>
<li><a href="/app/dashboards#/view/...">Dashboard5</a></li>
<li><a href="/app/dashboards#/view/...">Dashboard6</a></li>
<li><a href="/app/dashboards#/view/...">Dashboard7</a></li>
</div>
</body>
</html>

(where the ... in the href attribute values represent each dashboard's unique ID)

Rather than a static, standalone HTML file, I'd be okay to do this in a Kibana dashboard—using, say, a TSVB Markdown panel with custom CSS—or, similarly, Markdown in Canvas. In fact, I've already played around with both options. However, as far as I can tell, there's no way to define a fluid single-panel dashboard or Canvas (that dynamically adjusts its size to occupy the full height and width of the available display area). Am I missing something?

Hi @GrahamHannington, responding to your question - Kibana doesn't have a feature of serving static HTML files. You could write your own plugin to kibana to achieve something like that, but it is not trivial.

You mentioned experimenting with Canvas and Dashboard – Canvas actually scales to one of the dimensions of screen pretty well, but then doesn't really scale to both dimensions – it preserves a proper ratio of width/height of the elements.

Screenshot 2021-04-23 at 14.17.32
Horizontal example canvas


Vertical screen example canvas

Hi,

We have a similar use case and we solved it by creating a separate dashboard as an entry page and a markdown visualization for creating a table containing the links and the description.

You could even write a program which reads the kibana API for dashboards and use the kibana API to create/update the visualization

Best regards
Wolfram

1 Like

If Kibana set the CSS property height to the value 100% on the element <div id="markdown-..."> and its child <div class="kbnMarkdown__body">, then CSS grids (implemented by applying custom CSS to Markdown) would be able to expand to the full height of the panel. (I know because I've just temporarily tweaked those elements in my browser's DevTools, and seen my grid expand.)

I've tried to set that height property via the CSS for the Markdown. I can see that the elements I want to affect are within the scope of the corresponding <style> element. However, Kibana outwits me by prepending all of the CSS selectors in that <style> element with #markdown-..., effectively pushing the scope down into the descendants of that #markdown-... element, so that the #markdown-... element itself is beyond my control. I've tried to "trick" Kibana into specifying a selector for that element, but to no avail.

I am sure I am missing something.

You could just create a Top Level Dashboard with TSVB Markdown Elements which Drill down / link to the dashboards you want.

Pretty sure that is exactly what this is...

The SIEM, MAPS etc are just those, you could make them simpler.

Like I said I am probably missing something

Nope, I don't think so. You're exactly right. I'm just whining about Kibana not allowing me to do what I want in CSS: allowing grids to expand to the full height of their container. I think I'm just gonna pull my head in and forget about that for now. Bigger fish to fry. :slightly_smiling_face:

1 Like

I thought I could just walk away from this topic, but, nope, it seems I have a bee in my bonnet :slight_smile: .

The thought of creating a TSVB Markdown panel for each dashboard that I want to link to irks me.

I'd much prefer a way, within Kibana, to iterate over the dashboard saved objects in the .kibana index pattern in a single panel. For example, simplistically, in a Markdown panel, like this (filtered by type: dashboard):

{{#each _all}}
- {{ dashboard.title }}
{{/each}}

"Simplistically", because:

  • I'd also want to get the dashboard ID (and use it to insert a link in the Markdown) and dashboard description
  • I'd want to list only the dashboards in the current Kibana space: that is, to filter the results where the namespace field value matches the current Kibana space (and I have no idea how to do that)
  • The reference to dashboard.title doesn't work!

Thoughts, suggestions welcome.

Thought bubble: would it be possible to create a Vega(-Lite) visualization that uses the Kibana saved objects API (using a relative path; so, referring to the same Kibana instance that is serving the visualization) to get the title, description, and ID of dashboards in the current Kibana space, and then display those details in a set of tiles that are links to those dashboards?

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.