grafana/pkg
Dimitris Sotirakis 258578766b
Alerting: Add checks for non supported units - disable defaulting to seconds (#32477)
* Add error handling for unknown units

* Fix test cases

* Add case for empty string

* Changed tests from convey to testify

* Fix lints

* Move regex vars

* Add regex as ng-patterns on alert_tab.html

* Update public/app/features/alerting/partials/alert_tab.html

Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>

* Update public/app/features/alerting/partials/alert_tab.html

Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>

* Make zero and empty string not throw errors

* Updated validation error comments

* Frequency should allow zero or empty strings

* use checkFrequency instead of ng-pattern

checkFrequency is not triggered if ng-pattern is defined.

* Extract getForValue func - add tests

* Fix linting

Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>
2021-04-12 15:53:51 +03:00
..
api LibraryPanels: Adds initial section and Page to Dashboard submenu (#32876) 2021-04-12 09:30:29 +02:00
bus Chore: Enable more go-ruleguard rules (#29781) 2020-12-14 15:51:59 +01:00
cmd Chore: Refactor Server Run and Shutdown (#32611) 2021-04-07 10:44:06 +03:00
components Fix broken gtime tests (#32582) 2021-04-01 09:14:06 +02:00
dashboards PluginManager: Make Plugins, Renderer and DataSources non-global (#31866) 2021-03-17 16:06:10 +01:00
events Chore: Remove unused Go code (#28852) 2020-11-17 11:51:31 +01:00
expr SSE: fix casing on classic conditions model. (#32754) 2021-04-07 16:12:22 +02:00
extensions Access Control: move features to Enterprise (#32640) 2021-04-06 16:49:09 +03:00
ifaces/gcsifaces GCS image uploader: Add tests (#28521) 2020-10-26 20:35:12 +01:00
infra FrontendMetrics: Adds new backend api that frontend can use to push frontend measurements and counters to prometheus (#32593) 2021-04-01 20:04:02 +02:00
login Chore: Rewrite brute force login protection test to standard library (#29986) 2021-01-02 13:39:25 +01:00
middleware Auth: support JWT Authentication (#29995) 2021-03-31 08:40:44 -07:00
mocks/mock_gcsifaces Plugins: Requests validator (#30445) 2021-02-03 20:47:45 +01:00
models Live: push scope to demultiplex incoming data to stream channels (#32808) 2021-04-08 12:40:06 -07:00
plugins Live: update Streaming plugin definitions, put frame schema in subscribe result data (#32561) 2021-04-02 19:41:45 +03:00
registry Chore: Add CloudWatch HTTP API tests (#29691) 2021-01-07 11:36:13 +01:00
schema Introduce "scuemata" system for CUE-based specification of Grafana objects (#32527) 2021-04-08 01:11:11 -07:00
server Chore: Refactor Server Run and Shutdown (#32611) 2021-04-07 10:44:06 +03:00
services Alerting: Add checks for non supported units - disable defaulting to seconds (#32477) 2021-04-12 15:53:51 +03:00
setting Auth: support JWT Authentication (#29995) 2021-03-31 08:40:44 -07:00
tests Alerting: Allow querying of Alerts from notifications (#32614) 2021-04-08 07:27:59 -04:00
tsdb testData: (backend) restore null/nan in predicatable scenarios (#32855) 2021-04-09 14:23:51 -04:00
util Chore: Use Header.Set method instead of Header.Add (#29804) 2020-12-14 15:13:01 +01:00
README.md move backend docs to their relevant folder (#32041) 2021-03-17 09:41:16 +01:00
ruleguard.rules.go Chore: Enable more go-ruleguard rules (#29781) 2020-12-14 15:51:59 +01:00

Backend

This directory contains the code for the Grafana backend. This document gives an overview of the directory structure, and ongoing refactorings.

For more information on developing for the backend:

Central folders of Grafana's backend

folder description
/pkg/api HTTP handlers and routing. Almost all handler funcs are global which is something we would like to improve in the future. Handlers should be associated with a struct that refers to all dependencies.
/pkg/cmd The binaries that we build: grafana-server and grafana-cli.
/pkg/components A mix of third-party packages and packages we have implemented ourselves. Includes our packages that have out-grown the util package and don't naturally belong somewhere else.
/pkg/infra Packages in infra should be packages that are used in multiple places in Grafana without knowing anything about the Grafana domain.
/pkg/services Packages in services are responsible for persisting domain objects and manage the relationship between domain objects. Services should communicate with each other using DI when possible. Most of Grafana's codebase still relies on global state for this. Any new features going forward should use DI.
/pkg/tsdb All backend implementations of the data sources in Grafana. Used by both Grafana's frontend and alerting.
/pkg/util Small helper functions that are used in multiple parts of the codebase. Many functions are placed directly in the util folders which is something we want to avoid. Its better to give the util function a more descriptive package name. Ex errutil.

Central components of Grafana's backend

package description
/pkg/bus The bus is described in more details under Communication
/pkg/models This is where we keep our domain model. This package should not depend on any package outside standard library. It does contain some references within Grafana but that is something we should avoid going forward.
/pkg/registry Package for managing services.
/pkg/services/alerting Grafana's alerting services. The alerting engine runs in a separate goroutine and shouldn't depend on anything else within Grafana.
/pkg/services/sqlstore Currently where the database logic resides.
/pkg/setting Anything related to Grafana global configuration should be dealt with in this package.

Dependency management

Refer to UPGRADING_DEPENDENCIES.md.

Ongoing refactoring

These issues are not something we want to address all at once but something we will improve incrementally. Since Grafana is released at a regular schedule the preferred approach is to do this in batches. Not only is it easier to review, but it also reduces the risk of conflicts when cherry-picking fixes from master to release branches. Please try to submit changes that span multiple locations at the end of the release cycle. We prefer to wait until the end because we make fewer patch releases at the end of the release cycle, so there are fewer opportunities for complications.

Global state

Global state makes testing and debugging software harder and it's something we want to avoid when possible. Unfortunately, there is quite a lot of global state in Grafana.

We want to migrate away from this by using the inject package to wire up all dependencies either in pkg/cmd/grafana-server/main.go or self-registering using registry.RegisterService ex https://github.com/grafana/grafana/blob/master/pkg/services/cleanup/cleanup.go#L25.

Limit the use of the init() function

Only use the init() function to register services/implementations.

Settings refactoring

The plan is to move all settings to from package level vars in settings package to the setting.Cfg struct. To access the settings, services and components can inject this setting.Cfg struct:

Cfg struct Injection example

Reduce the use of GoConvey

We want to migrate away from using GoConvey. Instead, we want to use stdlib testing, because it's the most common approach in the Go community and we think it will be easier for new contributors. Read more about how we want to write tests in the style guide.

Refactor SqlStore

The sqlstore handlers all use a global xorm engine variable. Refactor them to use the SqlStore instance.

Avoid global HTTP handler functions

Refactor HTTP handlers so that the handler methods are on the HttpServer instance or a more detailed handler struct. E.g (AuthHandler). This ensures they get access to HttpServer service dependencies (and Cfg object) and can avoid global state.

Date comparison

Store newly introduced date columns in the database as epochs if they require date comparison. This permits a unified approach for comparing dates against all the supported databases instead of handling dates differently for each database. Also, by comparing epochs, we no longer need error pruning transformations to and from other time zones.

Avoid use of the simplejson package

Use of the simplejson package (pkg/components/simplejson) in place of types (Go structs) results in code that is difficult to maintain. Instead, create types for objects and use the Go standard library's encoding/json package.

Provisionable*

All new features that require state should be possible to configure using config files. For example:

Today its only possible to provision data sources and dashboards but this is something we want to support all over Grafana.