From f85d6b32276caafb897faa9b20f3b4d55a88b0c3 Mon Sep 17 00:00:00 2001 From: ricoberger Date: Thu, 8 Apr 2021 19:10:09 +0200 Subject: [PATCH] Add plugin support for Kubernetes resources It is now possible to use plugins within Kubernetes resources. For that a user can specify the "kobs.io/plugins" annotation on each resource and kobs will add the specified plugins, when a user views the resource. The plugin annotation must be a list of plugins, which have the same specification as the plugins section in the Applications. It is also possible to specify a list of Applications within a resource. For that the "kobs.io/applications" annotation can be used. The annotation requires a list of object, where each object must specify the "name" of the application and an optional "namespace", when the Application isn't in the same namespace as the resource. --- CHANGELOG.md | 1 + CONTRIBUTING.md | 144 +----------- .../applications/ApplicationDetailsLink.tsx | 2 +- .../components/resources/ResourceDetails.tsx | 212 ++++++++++++++---- app/src/plugins/elasticsearch/helpers.ts | 33 +++ app/src/plugins/jaeger/helpers.ts | 34 +++ app/src/plugins/prometheus/helpers.ts | 78 +++++++ app/src/utils/constants.ts | 7 + app/src/utils/plugins.tsx | 37 +++ deploy/demo/bookinfo/details.yaml | 50 +++++ deploy/demo/bookinfo/productpage.yaml | 50 +++++ deploy/demo/bookinfo/ratings.yaml | 50 +++++ deploy/demo/bookinfo/reviews.yaml | 150 +++++++++++++ deploy/demo/observability/kobs.yaml | 2 + docs/contributing/add-a-plugin.md | 147 ++++++++++++ .../development-using-the-demo.md | 31 +++ .../{contributing.md => getting-started.md} | 2 +- docs/installation/demo.md | 32 --- docs/plugins/jaeger.md | 2 +- docs/resources/assets/resources-plugins.png | Bin 0 -> 127931 bytes docs/resources/resources.md | 103 +++++++++ mkdocs.yml | 5 +- 22 files changed, 950 insertions(+), 222 deletions(-) create mode 100644 docs/contributing/add-a-plugin.md create mode 100644 docs/contributing/development-using-the-demo.md rename docs/contributing/{contributing.md => getting-started.md} (96%) create mode 100644 docs/resources/assets/resources-plugins.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 03e6af2cf..b5ba2d5e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ NOTE: As semantic versioning states all 0.y.z releases can contain breaking chan ### Added - [#29](https://github.com/kobsio/kobs/pull/29): Add a new dependencies section to the Application CR. These dependencies are used to show a topology graph for all Applications. +- [#31](https://github.com/kobsio/kobs/pull/31): Add plugin support for Kubernetes resources. ### Fixed diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0c339b890..cd5356ae8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,7 @@ - [Server](#server) - [Envoy](#envoy) - [Run kobs](#run-kobs) -- [Add a new Plugin](#add-a-new-plugin) +- [Documentation](#documentation) Every contribution to kobs is welcome, whether it is reporting a bug, submitting a fix, proposing new features or becoming a maintainer. To make contributing to kubenav as easy as possible you will find more details for the development flow in this documentation. @@ -155,144 +155,6 @@ When you want to run kobs inside your Kubernetes cluster, please checkout the Do **Using the demo application:** If you want to test your changes against the demo application take a look at [https://kobs.io/installation/demo/#development-using-the-demo](https://kobs.io/installation/demo/#development-using-the-demo). -## Add a new Plugin +## Documentation -To add a new plugin to kobs, you have to create a `proto/.proto`. Our [Makefile](./Makefile) will the handle the code generation for your plugin. - -```protobuf -syntax = "proto3"; -package plugins.; - -option go_package = "github.com/kobsio/kobs/pkg/api/plugins//proto"; -``` - -To add your plugin to the Application CRD, add a corresponding field to the `Plugin` message format in the `proto/plugins.proto` file: - -```protobuf -syntax = "proto3"; -package plugins; - -option go_package = "github.com/kobsio/kobs/pkg/api/plugins/plugins/proto"; - -import ".proto"; - -message Plugin { - .Spec = 1; -} -``` - -Besides the protocol buffers definition your also have to create a `pkg/api/plugins//.go` file, which implements your definition and handles the registration of your plugin. To register your plugin you have to modify the `Register` function in the `pkg/api/plugins/plugins/plugins.go` file: - -```go -package plugins - -import ( - "github.com/kobsio/kobs/pkg/api/plugins/" -) - -func Register(cfg *config.Config, grpcServer *grpc.Server) error { - Instances, err := .Register(cfg., grpcServer) - if err != nil { - log.WithError(err).WithFields(logrus.Fields{"plugin": ""}).Errorf("Failed to register plugin.") - return err - } - - plugins = append(plugins, Instances...) -} -``` - -The configuration for your plugin must be added to the `Config` struct in the `pkg/config/config.go` file: - -```go -package config - -import ( - "github.com/kobsio/kobs/pkg/api/plugins/" -) - -type Config struct { - [].Config `yaml:""` -} -``` - -Now your plugin is registered at the gRPC server and can be configured via a `config.yaml` file. In the next step you can implement the Reac UI components for your plugin. Your plugin must provide the following two components as entry point: `app/src/plugins//Page.tsx` and `app/src/plugins//Plugin.tsx`: - -```tsx -import { - PageSection, - PageSectionVariants, - Title, -} from '@patternfly/react-core'; -import React from 'react'; - -import { IPluginPageProps } from 'utils/plugins'; - -const Page: React.FunctionComponent = ({ name, description }: IPluginPageProps) => { - return ( - - - - {name} - -

{description}

-
-
- ); -}; - -export default Page; -``` - -```tsx -import React from 'react'; - -import { IPluginProps } from 'utils/plugins'; -import PluginDataMissing from 'components/plugins/PluginDataMissing'; - -const Plugin: React.FunctionComponent = ({ - name, - description, - plugin, - showDetails, -}: IPluginProps) => { - if (!plugin.) { - return ( - - ); - } - - return ( - - - ); -}; - -export default Plugin; -``` - -In the last step you have to register these two React components in the `app/src/utils/plugins.tsx` file: - -```tsx -import React from 'react'; - -import Page from 'plugins//Page'; -import Plugin from 'plugins//Plugin'; - -export const plugins: IPlugins = { - : { - page: Page, - plugin: Plugin, - }, -}; -``` - -Thats it, now you can generate the Go and TypeScript code from your `.proto` file and the new Application CRD with the following command: - -```sh -make generate -``` +More information, for example how to use the demo in you development workflow or how to submit a new plugin can be found in the documentation at [https://kobs.io/contributing/getting-started/](https://kobs.io/contributing/getting-started/). diff --git a/app/src/components/applications/ApplicationDetailsLink.tsx b/app/src/components/applications/ApplicationDetailsLink.tsx index ae17404e8..102ba9a13 100644 --- a/app/src/components/applications/ApplicationDetailsLink.tsx +++ b/app/src/components/applications/ApplicationDetailsLink.tsx @@ -21,7 +21,7 @@ const ApplicationDetailsLink: React.FunctionComponent { - setLink(`/applications/${application.cluster}/${application.namespace}/${application.name}${location.search}`); + setLink(`/applications/${application.cluster}/${application.namespace}/${application.name}`); }, [application, location.search]); return ; diff --git a/app/src/components/resources/ResourceDetails.tsx b/app/src/components/resources/ResourceDetails.tsx index 9de8750d5..0cfedbee5 100644 --- a/app/src/components/resources/ResourceDetails.tsx +++ b/app/src/components/resources/ResourceDetails.tsx @@ -1,21 +1,71 @@ import { + Alert, + AlertVariant, + Button, + DescriptionList, + DescriptionListDescription, + DescriptionListGroup, + DescriptionListTerm, DrawerActions, DrawerCloseButton, DrawerHead, DrawerPanelBody, DrawerPanelContent, Tab, - TabContent, TabTitleText, Tabs, } from '@patternfly/react-core'; -import React, { useRef, useState } from 'react'; +import React, { useContext, useState } from 'react'; import { IRow } from '@patternfly/react-table'; +import { JSONPath } from 'jsonpath-plus'; +import { Link } from 'react-router-dom'; +import { TopologyIcon } from '@patternfly/react-icons'; import yaml from 'js-yaml'; +import { IPluginsContext, PluginsContext } from 'context/PluginsContext'; +import { applicationAnnotation, pluginAnnotation } from 'utils/constants'; import Editor from 'components/Editor'; +import { Plugin as IPlugin } from 'proto/plugins_grpc_web_pb'; +import Plugin from 'components/plugins/Plugin'; import ResourceEvents from 'components/resources/ResourceEvents'; import Title from 'components/Title'; +import { plugins as pluginsDefinition } from 'utils/plugins'; + +// interpolate is used to replace a variable ("<< $.metadata.name >>") with the result of the JSONPath from the resource +// object. This can be used to replace a query in a plugin with the name of the resource, which has the plugins +// annotation. +// To interpolate the plugins annotation we split the string by the given start pattern ("<<"), then we split the +// results again by the end pattern (">>"). The string between these patterns is then given over to our JSONPath +// function together with the complete manifest for the resource. The result of the JSONPath function is then placed at +// the position of the placeholder. Finally we have to merge everything together. +// See: https://stackoverflow.com/a/57598892/4104109 +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const interpolate = (str: string, resource: any, interpolator: string[] = ['<<', '>>']): string => { + return str + .split(interpolator[0]) + .map((s1, i) => { + if (i === 0) { + return s1; + } + + const s2 = s1.split(interpolator[1]); + if (s1 === s2[0]) { + return interpolator[0] + s2[0]; + } + + if (s2.length > 1) { + s2[0] = s2[0] ? JSONPath({ json: resource, path: s2[0].trim(), wrap: false }) : interpolator.join(''); + } + + return s2.join(''); + }) + .join(''); +}; + +interface IApplications { + namespace?: string; + name: string; +} // IResourceDetailsProps is the interface for the ResourceDetails. The component requires a resource and an function to // close the drawer panel. @@ -32,8 +82,58 @@ const ResourceDetails: React.FunctionComponent = ({ close, }: IResourceDetailsProps) => { const [activeTab, setActiveTab] = useState('yaml'); - const refYamlContent = useRef(null); - const refEventsContent = useRef(null); + const pluginsContext = useContext(PluginsContext); + + let applications: IApplications[] = []; + const plugins: IPlugin.AsObject[] = []; + let applicationsError = ''; + let pluginsError = ''; + + try { + if ( + resource.props && + resource.props.metadata && + resource.props.metadata.annotations && + resource.props.metadata.annotations[applicationAnnotation] + ) { + applications = JSON.parse(resource.props.metadata.annotations[applicationAnnotation], resource.props); + } + } catch (err) { + applicationsError = err.message; + } + + try { + if ( + resource.props && + resource.props.metadata && + resource.props.metadata.annotations && + resource.props.metadata.annotations[pluginAnnotation] + ) { + const parsedPlugins = JSON.parse( + interpolate(resource.props.metadata.annotations[pluginAnnotation], resource.props), + ); + + for (const parsedPlugin of parsedPlugins) { + if (!parsedPlugin.name) { + throw new Error('Plugin name is missing'); + } + + const pluginDetails = pluginsContext.getPluginDetails(parsedPlugin.name); + if (!pluginDetails) { + throw new Error('Plugin was not found'); + } + + const plugin = pluginsDefinition[pluginDetails.type].jsonToProto(parsedPlugin); + if (!plugin) { + throw new Error('Could not parse plugin annotation.'); + } + + plugins.push(plugin); + } + } + } catch (err) { + pluginsError = err.message; + } return ( @@ -51,52 +151,74 @@ const ResourceDetails: React.FunctionComponent = ({ +
+ {applicationsError ? ( + +

{applicationsError}

+
+ ) : applications.length > 0 ? ( + + + Applications + + {applications.map((application, index) => ( + + +
+ + ))} +
+
+
+ ) : null} +
+ setActiveTab(tabIndex.toString())} + className="pf-u-mt-md" + isFilled={true} + mountOnEnter={true} > - Yaml} - tabContentId="refYaml" - tabContentRef={refYamlContent} - /> - Events} - tabContentId="refEvents" - tabContentRef={refEventsContent} - /> + Yaml}> +
+ +
+
+ Events}> +
+ +
+
+ {pluginsError ? ( + Plugins}> +
+ +

{pluginsError}

+
+
+
+ ) : plugins.length > 0 ? ( + plugins.map((plugin, index) => ( + {plugin.name}}> +
+ +
+
+ )) + ) : null}
- - - - - -
); diff --git a/app/src/plugins/elasticsearch/helpers.ts b/app/src/plugins/elasticsearch/helpers.ts index 1dc196111..00ee13dd6 100644 --- a/app/src/plugins/elasticsearch/helpers.ts +++ b/app/src/plugins/elasticsearch/helpers.ts @@ -1,3 +1,5 @@ +import { Query, Spec } from 'proto/elasticsearch_grpc_web_pb'; +import { Plugin } from 'proto/plugins_grpc_web_pb'; import { formatTime } from 'utils/helpers'; // ITimes is the interface for a start and end time. @@ -84,3 +86,34 @@ export const getProperty = (obj: any, key: string): string | number => { export const formatTimeWrapper = (time: string): string => { return formatTime(Math.floor(new Date(time).getTime() / 1000)); }; + +// jsonToProto is used to convert a json object into the protobuf message format for the Prometheus plugin. This is +// needed, so that users can use the plugin within resources, where the plugin specs are specified as json object. +// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types +export const jsonToProto = (json: any): Plugin.AsObject | undefined => { + if (!json.elasticsearch || !json.elasticsearch.queries || !Array.isArray(json.elasticsearch.queries)) { + return undefined; + } + + const queries: Query[] = []; + for (const query of json.elasticsearch.queries) { + if (query.name && query.query) { + const q = new Query(); + q.setName(query.name); + q.setQuery(query.query); + q.setFieldsList(query.fields && Array.isArray(query.fields) ? query.fields : []); + queries.push(q); + } else { + return undefined; + } + } + + const elasticsearch = new Spec(); + elasticsearch.setQueriesList(queries); + + const plugin = new Plugin(); + plugin.setName(json.name); + plugin.setElasticsearch(elasticsearch); + + return plugin.toObject(); +}; diff --git a/app/src/plugins/jaeger/helpers.ts b/app/src/plugins/jaeger/helpers.ts index f2f481912..8d020f76d 100644 --- a/app/src/plugins/jaeger/helpers.ts +++ b/app/src/plugins/jaeger/helpers.ts @@ -1,5 +1,7 @@ import { ChartThemeColor, getDarkThemeColors } from '@patternfly/react-charts'; +import { Query, Spec } from 'proto/jaeger_grpc_web_pb'; +import { Plugin } from 'proto/plugins_grpc_web_pb'; import { formatTime } from 'utils/helpers'; export interface IKeyValue { @@ -233,3 +235,35 @@ export const doesTraceContainsError = (trace: ITrace): boolean => { return false; }; + +// jsonToProto is used to convert a json object into the protobuf message format for the Prometheus plugin. This is +// needed, so that users can use the plugin within resources, where the plugin specs are specified as json object. +// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types +export const jsonToProto = (json: any): Plugin.AsObject | undefined => { + if (!json.jaeger || !json.jaeger.queries || !Array.isArray(json.jaeger.queries)) { + return undefined; + } + + const queries: Query[] = []; + for (const query of json.jaeger.queries) { + if (query.name && query.service) { + const q = new Query(); + q.setName(query.name); + q.setService(query.service); + q.setOperation(query.operation ? query.operation : ''); + q.setTags(query.tags ? query.tags : ''); + queries.push(q); + } else { + return undefined; + } + } + + const jaeger = new Spec(); + jaeger.setQueriesList(queries); + + const plugin = new Plugin(); + plugin.setName(json.name); + plugin.setJaeger(jaeger); + + return plugin.toObject(); +}; diff --git a/app/src/plugins/prometheus/helpers.ts b/app/src/plugins/prometheus/helpers.ts index c1a386f61..094f3ae32 100644 --- a/app/src/plugins/prometheus/helpers.ts +++ b/app/src/plugins/prometheus/helpers.ts @@ -1,3 +1,6 @@ +import { Chart, Query, Spec, Variable } from 'proto/prometheus_grpc_web_pb'; +import { Plugin } from 'proto/plugins_grpc_web_pb'; + // ITimes is the interface for a start and end time. export interface ITimes { timeEnd: number; @@ -27,3 +30,78 @@ export const getOptionsFromSearch = (search: string): IPrometheusOptions => { timeStart: timeStart ? parseInt(timeStart as string) : Math.floor(Date.now() / 1000) - 3600, }; }; + +// jsonToProto is used to convert a json object into the protobuf message format for the Prometheus plugin. This is +// needed, so that users can use the plugin within resources, where the plugin specs are specified as json object. +// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types +export const jsonToProto = (json: any): Plugin.AsObject | undefined => { + if (!json.prometheus) { + return undefined; + } + + const variables: Variable[] = []; + if (json.prometheus.variables && Array.isArray(json.prometheus.variables)) { + for (const variable of json.prometheus.variables) { + if (variable.name && variable.label && variable.query) { + const v = new Variable(); + v.setName(variable.name); + v.setLabel(variable.label); + v.setQuery(variable.query); + v.setAllowall(variable.allowAll ? true : false); + variables.push(v); + } + } + } + + const charts: Chart[] = []; + if (json.prometheus.charts && Array.isArray(json.prometheus.charts)) { + for (const chart of json.prometheus.charts) { + if (chart.title && chart.type) { + if (chart.type === 'divider') { + const c = new Chart(); + c.setTitle(chart.title); + c.setType(chart.type); + charts.push(c); + } else { + if (chart.queries && Array.isArray(chart.queries)) { + const c = new Chart(); + c.setTitle(chart.title); + c.setType(chart.type); + c.setUnit(chart.unit ? chart.unit : ''); + c.setStacked(chart.stacked ? true : false); + c.setSize(chart.size ? chart.size : 12); + + const queries: Query[] = []; + for (const query of chart.queries) { + if (query.query && query.label) { + const q = new Query(); + q.setLabel(query.label); + q.setQuery(query.query); + queries.push(q); + } else { + return undefined; + } + } + + c.setQueriesList(queries); + charts.push(c); + } else { + return undefined; + } + } + } else { + return undefined; + } + } + } + + const prometheus = new Spec(); + prometheus.setVariablesList(variables); + prometheus.setChartsList(charts); + + const plugin = new Plugin(); + plugin.setName(json.name); + plugin.setPrometheus(prometheus); + + return plugin.toObject(); +}; diff --git a/app/src/utils/constants.ts b/app/src/utils/constants.ts index 705de9804..4f9c0c502 100644 --- a/app/src/utils/constants.ts +++ b/app/src/utils/constants.ts @@ -10,3 +10,10 @@ export const applicationsDescription = 'Applications are a Custom Resource for k // resourcesDescription is the description, which is displayed in the UI on the resources card on the overview page // and the resources page. export const resourcesDescription = 'Resources are all available Kubernetes resources.'; + +// applicationAnnotation is the key for the annotation, which allows a user to specify a list of applications within a +// resource +export const applicationAnnotation = 'kobs.io/applications'; + +// pluginAnnotation is the key for the annotation, which allows a user to specify a list of plugins within a resource. +export const pluginAnnotation = 'kobs.io/plugins'; diff --git a/app/src/utils/plugins.tsx b/app/src/utils/plugins.tsx index 6af8c45fa..81805918f 100644 --- a/app/src/utils/plugins.tsx +++ b/app/src/utils/plugins.tsx @@ -8,9 +8,41 @@ import JaegerPlugin from 'plugins/jaeger/JaegerPlugin'; import PrometheusPage from 'plugins/prometheus/PrometheusPage'; import PrometheusPlugin from 'plugins/prometheus/PrometheusPlugin'; import PrometheusPreview from 'plugins/prometheus/PrometheusPreview'; +import { jsonToProto as elasticsearchJsonToProto } from 'plugins/elasticsearch/helpers'; +import { jsonToProto as jaegerJsonToProto } from 'plugins/jaeger/helpers'; +import { jsonToProto as prometheusJsonToProto } from 'plugins/prometheus/helpers'; import { Plugin as IProtoPlugin } from 'proto/plugins_grpc_web_pb'; +// jsonToProto is a simple json to protobuf converter function, which can be used instead of the jsonToProto function +// defined by every plugin. So that we can also try to render the plugin, when it doesn't specify a jsonToProto +// function. +// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types +// const jsonToProto = (json: any): IProtoPlugin.AsObject | undefined => { +// for (const [field] of Object.entries(json)) { +// if (typeof json[field] === 'object') { +// if (Array.isArray(json[field])) { +// json[`${field.toLowerCase()}List`] = jsonToProto(json[field]); +// delete json[field]; +// } else { +// if (field.toLowerCase() !== field) { +// json[field.toLowerCase()] = jsonToProto(json[field]); +// delete json[field]; +// } else { +// json[field] = jsonToProto(json[field]); +// } +// } +// } else { +// if (field.toLowerCase() !== field) { +// json[field.toLowerCase()] = json[field]; +// delete json[field]; +// } +// } +// } + +// return json as IProtoPlugin.AsObject; +// }; + // IPluginPageProps is the interface for the properties, which are passed to the page implementation of a plugin. This // is the name and the description of the plugin. export interface IPluginPageProps { @@ -31,6 +63,8 @@ export interface IPluginProps { // IPlugin is the interface for a single plugin implementation. Each plugin must implement a plugin component, which can // be used within an application and a page, which can be used to retrieve data of this plugin withour an application. export interface IPlugin { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + jsonToProto: (json: any) => IProtoPlugin.AsObject | undefined; page: React.FunctionComponent; plugin: React.FunctionComponent; preview?: React.FunctionComponent; @@ -45,15 +79,18 @@ export interface IPlugins { // plugins is the list of all supported plugins. export const plugins: IPlugins = { elasticsearch: { + jsonToProto: elasticsearchJsonToProto, page: ElasticsearchPage, plugin: ElasticsearchPlugin, preview: ElasticsearchPreview, }, jaeger: { + jsonToProto: jaegerJsonToProto, page: JaegerPage, plugin: JaegerPlugin, }, prometheus: { + jsonToProto: prometheusJsonToProto, page: PrometheusPage, plugin: PrometheusPlugin, preview: PrometheusPreview, diff --git a/deploy/demo/bookinfo/details.yaml b/deploy/demo/bookinfo/details.yaml index 1e0aa5a1c..1f83432dc 100644 --- a/deploy/demo/bookinfo/details.yaml +++ b/deploy/demo/bookinfo/details.yaml @@ -43,6 +43,56 @@ spec: labels: app: details version: v1 + annotations: + kobs.io/applications: | + [{"name": "details"}] + kobs.io/plugins: | + [ + { + "name": "Prometheus", + "prometheus": { + "variables": [ + { "name": "Container", "label": "container", "query": "container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container!=\"POD\", container!=\"\"}", "allowAll": true } + ], + "charts": [ + { + "title": "CPU Usage", + "type": "area", + "unit": "Cores", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container))" } + ] + }, + { + "title": "Memory Usage", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_memory_usage_bytes{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container)) / 1024 / 1024" } + ] + }, + { + "title": "Network I/O", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Receive", "query": "sum(rate(container_network_receive_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" }, + { "label": "Transmit", "query": "-sum(rate(container_network_transmit_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" } + ] + } + ] + } + }, + { + "name": "Elasticsearch", + "elasticsearch": { + "queries": [ + { "name": "Container Logs: productpage", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: productpage" }, + { "name": "Container Logs: istio-proxy", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: istio-proxy", "fields": ["kubernetes.pod.name", "content.protocol", "content.method", "content.path", "content.response_code", "content.duration"] } + ] + } + } + ] spec: serviceAccountName: bookinfo-details containers: diff --git a/deploy/demo/bookinfo/productpage.yaml b/deploy/demo/bookinfo/productpage.yaml index 79fc6074c..ab562ef85 100644 --- a/deploy/demo/bookinfo/productpage.yaml +++ b/deploy/demo/bookinfo/productpage.yaml @@ -43,6 +43,56 @@ spec: labels: app: productpage version: v1 + annotations: + kobs.io/applications: | + [{"name": "productpage"}] + kobs.io/plugins: | + [ + { + "name": "Prometheus", + "prometheus": { + "variables": [ + { "name": "Container", "label": "container", "query": "container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container!=\"POD\", container!=\"\"}", "allowAll": true } + ], + "charts": [ + { + "title": "CPU Usage", + "type": "area", + "unit": "Cores", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container))" } + ] + }, + { + "title": "Memory Usage", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_memory_usage_bytes{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container)) / 1024 / 1024" } + ] + }, + { + "title": "Network I/O", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Receive", "query": "sum(rate(container_network_receive_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" }, + { "label": "Transmit", "query": "-sum(rate(container_network_transmit_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" } + ] + } + ] + } + }, + { + "name": "Elasticsearch", + "elasticsearch": { + "queries": [ + { "name": "Container Logs: productpage", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: productpage" }, + { "name": "Container Logs: istio-proxy", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: istio-proxy", "fields": ["kubernetes.pod.name", "content.protocol", "content.method", "content.path", "content.response_code", "content.duration"] } + ] + } + } + ] spec: serviceAccountName: bookinfo-productpage containers: diff --git a/deploy/demo/bookinfo/ratings.yaml b/deploy/demo/bookinfo/ratings.yaml index 5f33d95fe..f0537c342 100644 --- a/deploy/demo/bookinfo/ratings.yaml +++ b/deploy/demo/bookinfo/ratings.yaml @@ -43,6 +43,56 @@ spec: labels: app: ratings version: v1 + annotations: + kobs.io/applications: | + [{"name": "ratings"}] + kobs.io/plugins: | + [ + { + "name": "Prometheus", + "prometheus": { + "variables": [ + { "name": "Container", "label": "container", "query": "container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container!=\"POD\", container!=\"\"}", "allowAll": true } + ], + "charts": [ + { + "title": "CPU Usage", + "type": "area", + "unit": "Cores", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container))" } + ] + }, + { + "title": "Memory Usage", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_memory_usage_bytes{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container)) / 1024 / 1024" } + ] + }, + { + "title": "Network I/O", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Receive", "query": "sum(rate(container_network_receive_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" }, + { "label": "Transmit", "query": "-sum(rate(container_network_transmit_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" } + ] + } + ] + } + }, + { + "name": "Elasticsearch", + "elasticsearch": { + "queries": [ + { "name": "Container Logs: productpage", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: productpage" }, + { "name": "Container Logs: istio-proxy", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: istio-proxy", "fields": ["kubernetes.pod.name", "content.protocol", "content.method", "content.path", "content.response_code", "content.duration"] } + ] + } + } + ] spec: serviceAccountName: bookinfo-ratings containers: diff --git a/deploy/demo/bookinfo/reviews.yaml b/deploy/demo/bookinfo/reviews.yaml index d03c3acad..c4b556fb2 100644 --- a/deploy/demo/bookinfo/reviews.yaml +++ b/deploy/demo/bookinfo/reviews.yaml @@ -43,6 +43,56 @@ spec: labels: app: reviews version: v1 + annotations: + kobs.io/applications: | + [{"name": "reviews"}] + kobs.io/plugins: | + [ + { + "name": "Prometheus", + "prometheus": { + "variables": [ + { "name": "Container", "label": "container", "query": "container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container!=\"POD\", container!=\"\"}", "allowAll": true } + ], + "charts": [ + { + "title": "CPU Usage", + "type": "area", + "unit": "Cores", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container))" } + ] + }, + { + "title": "Memory Usage", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_memory_usage_bytes{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container)) / 1024 / 1024" } + ] + }, + { + "title": "Network I/O", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Receive", "query": "sum(rate(container_network_receive_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" }, + { "label": "Transmit", "query": "-sum(rate(container_network_transmit_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" } + ] + } + ] + } + }, + { + "name": "Elasticsearch", + "elasticsearch": { + "queries": [ + { "name": "Container Logs: productpage", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: productpage" }, + { "name": "Container Logs: istio-proxy", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: istio-proxy", "fields": ["kubernetes.pod.name", "content.protocol", "content.method", "content.path", "content.response_code", "content.duration"] } + ] + } + } + ] spec: serviceAccountName: bookinfo-reviews containers: @@ -88,6 +138,56 @@ spec: labels: app: reviews version: v2 + annotations: + kobs.io/applications: | + [{"name": "reviews"}] + kobs.io/plugins: | + [ + { + "name": "Prometheus", + "prometheus": { + "variables": [ + { "name": "Container", "label": "container", "query": "container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container!=\"POD\", container!=\"\"}", "allowAll": true } + ], + "charts": [ + { + "title": "CPU Usage", + "type": "area", + "unit": "Cores", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container))" } + ] + }, + { + "title": "Memory Usage", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_memory_usage_bytes{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container)) / 1024 / 1024" } + ] + }, + { + "title": "Network I/O", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Receive", "query": "sum(rate(container_network_receive_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" }, + { "label": "Transmit", "query": "-sum(rate(container_network_transmit_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" } + ] + } + ] + } + }, + { + "name": "Elasticsearch", + "elasticsearch": { + "queries": [ + { "name": "Container Logs: productpage", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: productpage" }, + { "name": "Container Logs: istio-proxy", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: istio-proxy", "fields": ["kubernetes.pod.name", "content.protocol", "content.method", "content.path", "content.response_code", "content.duration"] } + ] + } + } + ] spec: serviceAccountName: bookinfo-reviews containers: @@ -133,6 +233,56 @@ spec: labels: app: reviews version: v3 + annotations: + kobs.io/applications: | + [{"name": "reviews"}] + kobs.io/plugins: | + [ + { + "name": "Prometheus", + "prometheus": { + "variables": [ + { "name": "Container", "label": "container", "query": "container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container!=\"POD\", container!=\"\"}", "allowAll": true } + ], + "charts": [ + { + "title": "CPU Usage", + "type": "area", + "unit": "Cores", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container))" } + ] + }, + { + "title": "Memory Usage", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_memory_usage_bytes{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container)) / 1024 / 1024" } + ] + }, + { + "title": "Network I/O", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Receive", "query": "sum(rate(container_network_receive_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" }, + { "label": "Transmit", "query": "-sum(rate(container_network_transmit_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" } + ] + } + ] + } + }, + { + "name": "Elasticsearch", + "elasticsearch": { + "queries": [ + { "name": "Container Logs: productpage", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: productpage" }, + { "name": "Container Logs: istio-proxy", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: istio-proxy", "fields": ["kubernetes.pod.name", "content.protocol", "content.method", "content.path", "content.response_code", "content.duration"] } + ] + } + } + ] spec: serviceAccountName: bookinfo-reviews containers: diff --git a/deploy/demo/observability/kobs.yaml b/deploy/demo/observability/kobs.yaml index 4365cfa8f..b1bd957ed 100644 --- a/deploy/demo/observability/kobs.yaml +++ b/deploy/demo/observability/kobs.yaml @@ -16,6 +16,8 @@ spec: - name: kobs image: "kobsio/kobs:0.1.0" imagePullPolicy: Always + args: + - --log.level=trace env: - name: KOBS_CLUSTERS_CACHE_DURATION_NAMESPACES value: 1m diff --git a/docs/contributing/add-a-plugin.md b/docs/contributing/add-a-plugin.md new file mode 100644 index 000000000..2227ea0ae --- /dev/null +++ b/docs/contributing/add-a-plugin.md @@ -0,0 +1,147 @@ +# Add a Plugin + +To add a new plugin to kobs, you have to create a `proto/.proto` file. Our [Makefile](./Makefile) will the handle the code generation for your plugin. + +```protobuf +syntax = "proto3"; +package plugins.; + +option go_package = "github.com/kobsio/kobs/pkg/api/plugins//proto"; +``` + +To add your plugin to the Application CRD, add a corresponding field to the `Plugin` message format in the `proto/plugins.proto` file: + +```protobuf +syntax = "proto3"; +package plugins; + +option go_package = "github.com/kobsio/kobs/pkg/api/plugins/plugins/proto"; + +import ".proto"; + +message Plugin { + .Spec = 1; +} +``` + +Besides the protocol buffers definition your also have to create a `pkg/api/plugins//.go` file, which implements your definition and handles the registration of your plugin. To register your plugin you have to modify the `Register` function in the `pkg/api/plugins/plugins/plugins.go` file: + +```go +package plugins + +import ( + "github.com/kobsio/kobs/pkg/api/plugins/" +) + +func Register(cfg *config.Config, grpcServer *grpc.Server) error { + Instances, err := .Register(cfg., grpcServer) + if err != nil { + log.WithError(err).WithFields(logrus.Fields{"plugin": ""}).Errorf("Failed to register plugin.") + return err + } + + plugins = append(plugins, Instances...) +} +``` + +The configuration for your plugin must be added to the `Config` struct in the `pkg/config/config.go` file: + +```go +package config + +import ( + "github.com/kobsio/kobs/pkg/api/plugins/" +) + +type Config struct { + [].Config `yaml:""` +} +``` + +Now your plugin is registered at the gRPC server and can be configured via a `config.yaml` file. In the next step you can implement the Reac UI components for your plugin. Your plugin must provide the following two components as entry point: `app/src/plugins//Page.tsx` and `app/src/plugins//Plugin.tsx`: + +```tsx +import { + PageSection, + PageSectionVariants, + Title, +} from '@patternfly/react-core'; +import React from 'react'; + +import { IPluginPageProps } from 'utils/plugins'; + +const Page: React.FunctionComponent = ({ name, description }: IPluginPageProps) => { + return ( + + + + {name} + +

{description}

+
+
+ ); +}; + +export default Page; +``` + +```tsx +import React from 'react'; + +import { IPluginProps } from 'utils/plugins'; +import PluginDataMissing from 'components/plugins/PluginDataMissing'; + +const Plugin: React.FunctionComponent = ({ + name, + description, + plugin, + showDetails, +}: IPluginProps) => { + if (!plugin.) { + return ( + + ); + } + + return ( + + + ); +}; + +export default Plugin; +``` + +In the last step you have to register these two React components in the `app/src/utils/plugins.tsx` file: + +```tsx +import React from 'react'; + +import Page from 'plugins//Page'; +import Plugin from 'plugins//Plugin'; +import Preview from 'plugins//Preview'; +import { jsonToProto as JsonToProto } from 'plugins//helpers'; + +export const plugins: IPlugins = { + : { + jsonToProto: JsonToProto, + page: Page, + plugin: Plugin, + preview: Preview, + }, +}; +``` + +The preview component is optional for every plugin. It is used in the Applications gallery, were your plugin can be used to provide additional information for an Application. You also do not have to specify a `jsonToProto` function and you can use the `jsonToProto` from the `app/src/utils/plugins.tsx` instead. In this case you have to properly check the users input, which can be avoided, by specifying an own `jsonToProto` function. + +Thats it, now you can generate the Go and TypeScript code from your `.proto` file and the new Application CRD with the following command: + +```sh +make generate +``` diff --git a/docs/contributing/development-using-the-demo.md b/docs/contributing/development-using-the-demo.md new file mode 100644 index 000000000..71b50473e --- /dev/null +++ b/docs/contributing/development-using-the-demo.md @@ -0,0 +1,31 @@ +# Development using the Demo + +The created kind cluster in the demo comes with a local registry, so that the demo can be used within your development flow. For that you have to build the Docker image with your changes and push it into the local registry: + +```sh +docker build -f ./cmd/kobs/Dockerfile -t localhost:5000/kobs:dev . +docker push localhost:5000/kobs:dev +``` + +When you have pushed your custom image, you have to adjust the patch file for the kobs deployment. Change the Docker image in the [`kobs.yaml`](https://github.com/kobsio/kobs/blob/main/deploy/demo/observability/kobs.yaml) file to the following: + +```sh +spec: + template: + spec: + containers: + - name: kobs + image: localhost:5000/kobs:dev +``` + +Now you can deploy the files for the `observability` namespace again: + +```sh +kustomize build deploy/demo/observability | kubectl apply -f - +``` + +Finally you can check if the kobs Pod is using your image, with the following command: + +```sh +k get pods -n observability -l app.kubernetes.io/name=kobs -o yaml | grep "image: localhost:5000/kobs:dev" +``` diff --git a/docs/contributing/contributing.md b/docs/contributing/getting-started.md similarity index 96% rename from docs/contributing/contributing.md rename to docs/contributing/getting-started.md index f5d66af4f..72abc318d 100644 --- a/docs/contributing/contributing.md +++ b/docs/contributing/getting-started.md @@ -1,4 +1,4 @@ -# Contributing +# Getting Started Every contribution to kobs is welcome, whether it is reporting a bug, submitting a fix, proposing new features or becoming a maintainer. To make contributing to kobs as easy as possible you will find more details for the development flow in our [Contribution Guideline](https://github.com/kobsio/kobs/blob/master/CONTRIBUTING.md). diff --git a/docs/installation/demo.md b/docs/installation/demo.md index d0d6c98a4..f649a3e8d 100644 --- a/docs/installation/demo.md +++ b/docs/installation/demo.md @@ -166,35 +166,3 @@ kind delete cluster --name kobs-demo docker stop kind-registry docker rm kind-registry ``` - -## Development using the Demo - -The created kind cluster comes with a local registry, so that the demo can be used within your development flow. For that you have to build the Docker image with your changes and push it into the local registry: - -```sh -docker build -f ./cmd/kobs/Dockerfile -t localhost:5000/kobs:dev . -docker push localhost:5000/kobs:dev -``` - -When you have pushed your custom image, you have to adjust the patch file for the kobs deployment. Change the Docker image in the [`kobs.yaml`](https://github.com/kobsio/kobs/blob/main/deploy/demo/observability/kobs.yaml) file to the following: - -```sh -spec: - template: - spec: - containers: - - name: kobs - image: localhost:5000/kobs:dev -``` - -Now you can deploy the files for the `observability` namespace again: - -```sh -kustomize build deploy/demo/observability | kubectl apply -f - -``` - -Finally you can check if the kobs Pod is using your image, with the following command: - -```sh -k get pods -n observability -l app.kubernetes.io/name=kobs -o yaml | grep "image: localhost:5000/kobs:dev" -``` diff --git a/docs/plugins/jaeger.md b/docs/plugins/jaeger.md index 42c4493e4..47e9c7b8f 100644 --- a/docs/plugins/jaeger.md +++ b/docs/plugins/jaeger.md @@ -22,7 +22,7 @@ The following specification can be used, within an application. | ----- | ---- | ----------- | -------- | | name | string | A name for the query. | Yes | | service | string | The service to retrieve traces for. | Yes | -| operations | string | An optional operation to retrieve traces for. | No | +| operation | string | An optional operation to retrieve traces for. | No | | tags | string | Tags, which the traces must be contain. | No | For example the following query specification will display all traces for the `reviews.bookinfo` service. diff --git a/docs/resources/assets/resources-plugins.png b/docs/resources/assets/resources-plugins.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1a98d7abb08982dcb29bf3940e86decc15d36b GIT binary patch literal 127931 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∋M1b#s3vhpoai7HC&|7VTU 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 G_`. ![Events](assets/resources-events.png) + +## Annotations + +You can extend your resources with additional information for kobs, by using annotations. This allows you to specify applications and plugins for your Kubernetes objects like Pods, Deployments, etc. + +| Annotations | Format | Description | +| ----------- | ------ | ----------- | +| `kobs.io/applications` | `[{"name": "application1"}, {"namespace": "namespace2", "name": "applications2"}]` | Specify a list of applications. You have to provide the name of the application and an optional namespace. If the namespace is not specified, the namespace of the resource will be used. | +| `kobs.io/plugin` | [[]Plugin](../plugins/getting-started.md#specification) | A list of plugins in the same format as it is used for applications. | + +### Applications + +Specify a list of applications within the `kobs.io/applications` annotation. The list contains multiple objects with the `name` of the application and an optional `namespace`, when the application is in another namespace then the Kubernetes resource. + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: productpage-v1 + namespace: bookinfo + labels: + app: productpage + version: v1 + annotations: + kobs.io/applications: | + [{"name": "productpage"}] +``` + +### Plugins + +Specify a list of plugins within the `kobs.io/plugins` annotation. The list contains multiple plugins, which follow the same sepecification as it is used for applications ([[]Plugin](../plugins/getting-started.md#specification)). + +Within each plugin you can use the templating feature to replace values in the annotation with values from the resource. A template starts with `<<` and end with `>>`, between the angle brackets you have to specify a [JSONPath](https://goessner.net/articles/JsonPath/). The JSONPath is run against the resource manifest and the brackets are replaced with the result of the JSONPath expression. For example the following expression will be replaced with the name of the resource: `<< $.metadata.name >>`. + +!!! note + We are using the [jsonpath-plus](https://www.npmjs.com/package/jsonpath-plus) to extract the content from the Kubernetes objects. A list of examples can be found within the documentation of the module. + +The following example adds the `kobs.io/plugins` annotation to each Pod of an Deployment. The corresponding Pods will then use the Prometheus plugin, to show the resource usage of the Pod and the Elasticsearch plugin to get all the logs for this Pod. + +```yaml +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: productpage-v1 + namespace: bookinfo + labels: + app: productpage + version: v1 +spec: + template: + metadata: + annotations: + kobs.io/plugins: | + [ + { + "name": "Prometheus", + "prometheus": { + "variables": [ + { "name": "Container", "label": "container", "query": "container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container!=\"POD\", container!=\"\"}", "allowAll": true } + ], + "charts": [ + { + "title": "CPU Usage", + "type": "area", + "unit": "Cores", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_cpu_usage_seconds_total{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container))" } + ] + }, + { + "title": "Memory Usage", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Current", "query": "sum(max(rate(container_memory_usage_bytes{namespace=\"<< $.metadata.namespace >>\", image!=\"\", pod=\"<< $.metadata.name >>\", container=~\"{{ .Container }}\", container!=\"POD\", container!=\"\"}[2m])) by (container)) / 1024 / 1024" } + ] + }, + { + "title": "Network I/O", + "type": "area", + "unit": "MiB", + "queries": [ + { "label": "Receive", "query": "sum(rate(container_network_receive_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" }, + { "label": "Transmit", "query": "-sum(rate(container_network_transmit_bytes_total{namespace=\"<< $.metadata.namespace >>\", pod=\"<< $.metadata.name >>\"}[2m])) by (pod) / 1024 / 1024" } + ] + } + ] + } + }, + { + "name": "Elasticsearch", + "elasticsearch": { + "queries": [ + { "name": "Container Logs: productpage", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: productpage" }, + { "name": "Container Logs: istio-proxy", "query": "kubernetes.namespace: << $.metadata.namespace >> AND kubernetes.pod.name: << $.metadata.name >> AND kubernetes.container.name: istio-proxy", "fields": ["kubernetes.pod.name", "content.protocol", "content.method", "content.path", "content.response_code", "content.duration"] } + ] + } + } + ] +``` + +![Plugins](assets/resources-plugins.png) diff --git a/mkdocs.yml b/mkdocs.yml index f864953af..93debbd08 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -34,7 +34,10 @@ nav: - Elasticsearch: plugins/elasticsearch.md - Jaeger: plugins/jaeger.md - Prometheus: plugins/prometheus.md - - Contributing: contributing/contributing.md + - Contributing: + - Getting Started: contributing/getting-started.md + - Add a Plugin: contributing/add-a-plugin.md + - Development using the Demo: contributing/development-using-the-demo.md plugins: - search