From 096e0e761e547278edd5c600332dda6a5e0710d7 Mon Sep 17 00:00:00 2001 From: Marcus Olsson Date: Tue, 8 Oct 2019 17:22:37 +0200 Subject: [PATCH] Docs: Simplify README (#19702) * Simplify README * Fix review comments * Rename Developer guide --- CONTRIBUTING.md | 4 +- README.md | 233 +++--------------- .../{development.md => developer-guide.md} | 0 docs/logo-horizontal.png | Bin 0 -> 27304 bytes docs/logo-swirl.svg | 64 +++++ 5 files changed, 94 insertions(+), 207 deletions(-) rename contribute/{development.md => developer-guide.md} (100%) create mode 100644 docs/logo-horizontal.png create mode 100644 docs/logo-swirl.svg diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 973f42d7ab4..52d8590a641 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,7 +52,7 @@ Unsure where to begin contributing to Grafana? Start by browsing issues labeled - [Beginner-friendly](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22beginner+friendly%22) issues are generally straightforward to complete. - [Help wanted](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) issues are problems we would like the community to help us with regardless of complexity. -If you're looking to make a code change, see how to set up your environment for [local development](contribute/development.md). +If you're looking to make a code change, see how to set up your environment for [local development](contribute/developer-guide.md). When you're ready to contribute, it's time to [Create a pull request](/contribute/pull-request.md). @@ -69,6 +69,6 @@ Before we can accept your pull request, you need to [sign our CLA](https://grafa ## Where do I go from here? -- Set up your [development environment](contribute/development.md). +- Set up your [development environment](contribute/developer-guide.md). - Learn how to [contribute documentation](contribute/documentation.md). - Get started [developing plugins](https://grafana.com/docs/plugins/developing/development/) for Grafana. diff --git a/README.md b/README.md index cd188d70f81..6f94735e0ff 100644 --- a/README.md +++ b/README.md @@ -1,222 +1,45 @@ -# [Grafana](https://grafana.com) [![Circle CI](https://circleci.com/gh/grafana/grafana.svg?style=svg)](https://circleci.com/gh/grafana/grafana) [![Go Report Card](https://goreportcard.com/badge/github.com/grafana/grafana)](https://goreportcard.com/report/github.com/grafana/grafana) +![Grafana](docs/logo-horizontal.png) -[Website](https://grafana.com) | -[Twitter](https://twitter.com/grafana) | -[Community & Forum](https://community.grafana.com) +The open-source platform for monitoring and observability. -Grafana is an open source, feature rich metrics dashboard and graph editor for -Graphite, Elasticsearch, OpenTSDB, Prometheus and InfluxDB. +[![License](https://img.shields.io/github/license/grafana/grafana)](LICENSE) +[![Circle CI](https://img.shields.io/circleci/build/gh/grafana/grafana)](https://circleci.com/gh/grafana/grafana) +[![Go Report Card](https://goreportcard.com/badge/github.com/grafana/grafana)](https://goreportcard.com/report/github.com/grafana/grafana) - +Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data driven culture: -## Installation +- **Visualize:** Fast and flexible client side graphs with a multitude of options. Panel plugins for many different way to visualize metrics and logs. +- **Dynamic Dashboards:** Create dynamic & reusable dashboards with template variables that appear as dropdowns at the top of the dashboard. +- **Explore Metrics:** Explore your data through ad-hoc queries and dynamic drilldown. Split view and compare different time ranges, queries and data sources side by side. +- **Explore Logs:** Experience the magic of switching from metrics to logs with preserved label filters. Quickly search through all your logs or streaming them live. +- **Alerting:** Visually define alert rules for your most important metrics. Grafana will continuously evaluate and send notifications to systems like Slack, PagerDuty, VictorOps, OpsGenie. +- **Mixed Data Sources:** Mix different data sources in the same graph! You can specify a data source on a per-query basis. This works for even custom datasources. -Head to [docs.grafana.org](http://docs.grafana.org/installation/) for documentation or [grafana.com/get](https://grafana.com/get) to download the latest release. +## Get started -## Documentation & Support +- [Get Grafana](https://grafana.com/get) +- [Installation guides](http://docs.grafana.org/installation/) -Be sure to read the [Getting Started](http://docs.grafana.org/guides/gettingstarted/) guide and the other feature guides. +Unsure if Grafana is for you? Watch Grafana in action on [play.grafana.org](https://play.grafana.org/)! -## Run from master +## Documentation -If you want to build a package yourself, or contribute - here is a guide for how to do that. You can always find -the latest master builds [here](https://grafana.com/grafana/download). +The Grafana documentation is available at [grafana.com/docs](https://grafana.com/docs/). -### Dependencies +## Contributing -- Go (Latest Stable) -- Node.js LTS - - yarn [`npm install -g yarn`] +If you're interested in contributing to the Grafana project: -### Get the project +- Start by reading the [Contributing guide](/CONTRIBUTING.md). +- Learn how to set up your local environment, in our [Developer guide](/contribute/developer-guide.md). +- Explore our [beginner-friendly issues](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22beginner+friendly%22). -**The project located in the go-path will be your working directory.** +## Get involved -```bash -go get github.com/grafana/grafana -cd $GOPATH/src/github.com/grafana/grafana -``` - -### Run and rebuild on source change - -#### Backend - -To run the backend and rebuild on source change: - -```bash -make run -``` - -#### Frontend -Install front-end dependencies first: - -```bash -yarn install --pure-lockfile -``` - -Rebuild on file change, and serve them by Grafana's webserver (http://localhost:3000): - -```bash -yarn start -``` - -Build the assets, rebuild on file change with Hot Module Replacement (HMR), and serve them by webpack-dev-server (http://localhost:3333): - -```bash -yarn start:hot -# OR set a theme -env GRAFANA_THEME=light yarn start:hot -``` - -_Note: HMR for Angular is not supported. If you edit files in the Angular part of the app, the whole page will reload._ - -Run tests and rebuild on source change: - -```bash -yarn jest -``` - -**Open grafana in your browser (default: e.g. `http://localhost:3000`) and login with admin user (default: `user/pass = admin/admin`).** - -### Building - -#### The backend - -```bash -go run build.go setup -go run build.go build -``` - -#### Frontend assets - -_For this you need Node.js (LTS version)._ - -```bash -yarn install --pure-lockfile -``` - -### Building a Docker image - -There are two different ways to build a Grafana docker image. If your machine is setup for Grafana development and you run linux/amd64 you can build just the image. Otherwise, there is the option to build Grafana completely within Docker. - -Run the image you have built using: `docker run --rm -p 3000:3000 grafana/grafana:dev` - -#### Building on linux/amd64 (fast) - -1. Build the frontend `go run build.go build-frontend`. -2. Build the docker image `make build-docker-dev`. - -The resulting image will be tagged as `grafana/grafana:dev`. - -#### Building anywhere (slower) - -Choose this option to build on platforms other than linux/amd64 and/or not have to setup the Grafana development environment. - -1. `make build-docker-full` or `docker build -t grafana/grafana:dev`. - -The resulting image will be tagged as `grafana/grafana:dev`. - -Notice: If you are using Docker for MacOS, be sure to set the memory limit to be larger than 2 GiB (at docker -> Preferences -> Advanced), otherwise `grunt build` may fail. - -## Development - -### Dev config - -Create a custom.ini in the conf directory to override default configuration options. -You only need to add the options you want to override. Config files are applied in the order of: - -1. grafana.ini -1. custom.ini - -In your custom.ini uncomment (remove the leading `;`) sign. And set `app_mode = development`. - -### Running tests - -#### Frontend - -Execute all frontend tests: - -```bash -yarn test -``` - -Write and watch frontend tests: - -- Start watcher: `yarn jest`. -- Jest runs all test files that end with the name ".test.ts". - -#### Backend - -```bash -# Run Golang tests using sqlite3 as database (default) -go test ./pkg/... -``` - -##### Running the MySQL or Postgres backend tests: - -Run these by setting `GRAFANA_TEST_DB` in your environment. - -- `GRAFANA_TEST_DB=mysql` to test MySQL -- `GRAFANA_TEST_DB=postgres` to test Postgres - -Follow the instructions in `./devenv` to spin up test containers running the appropriate databases with `docker-compose` -- Use `docker/blocks/mysql_tests` or `docker/blocks/postgres_tests` as appropriate. - -```bash -# MySQL -# Tests can only be ran in one Go package at a time due to clashing db queries. To run MySQL tests for the "pkg/services/sqlstore" package, run: -GRAFANA_TEST_DB=mysql go test ./pkg/services/sqlstore/... - -# Or run all the packages using the circle CI scripts. This method will be slower as the scripts will run all the tests, including the integration tests. -./scripts/circle-test-mysql.sh -``` - -```bash -# Postgres -# Tests can only be ran in one Go package at a time due to clashing db queries. To run Postgres tests for the "pkg/services/sqlstore" package, run: -GRAFANA_TEST_DB=postgres go test ./pkg/services/sqlstore/... - -# Or run all the packages using the circle CI scripts. This method will be slower as the scripts will run all the tests, including the integration tests. -./scripts/circle-test-postgres.sh -``` - -#### End-to-end - -Execute all end-to-end tests: - -```bash -yarn e2e-tests -``` - -Execute all end-to-end tests using using a specific url: - -```bash -ENV BASE_URL=http://localhost:3333 yarn e2e-tests -``` - -Debugging all end-to-end tests (BROWSER=1 starts the browser and SLOWMO=1 delays each puppeteer operation by 100ms): - -```bash -ENV BROWSER=1 SLOWMO=1 yarn e2e-tests -``` - -### Data source and dashboard provisioning - -[Here](https://github.com/grafana/grafana/tree/master/devenv) you can find helpful scripts and docker-compose setup -that will populate your dev environment for quicker testing and experimenting. - -## Contribute - -If you have any ideas for improvement or have found a bug, do not hesitate to open an issue. -And if you have time, clone this repo and submit a pull request to help me make Grafana the kickass metrics and devops dashboard we all dream about! - -Read the [contributing](https://github.com/grafana/grafana/blob/master/CONTRIBUTING.md) guide then check the [`beginner friendly`](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22beginner+friendly%22) label to find issues that are easy and that we would like help with. - -## Plugin development - -Checkout the [Plugin Development Guide](http://docs.grafana.org/plugins/developing/development/) and checkout the [PLUGIN_DEV.md](https://github.com/grafana/grafana/blob/master/PLUGIN_DEV.md) file for changes in Grafana that relate to plugin development. +- Follow [@grafana on Twitter](https://twitter.com/grafana/) +- Read and subscribe to the [Grafana blog](https://grafana.com/blog/) +- If you have a specific question, check out our [discussion forums](https://community.grafana.com/). +- For general discussions, join us on the [official Slack](http://slack.raintank.io/) team. ## License diff --git a/contribute/development.md b/contribute/developer-guide.md similarity index 100% rename from contribute/development.md rename to contribute/developer-guide.md diff --git a/docs/logo-horizontal.png b/docs/logo-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a9e51ff36924b4e1503782c9003e300ea6982b GIT binary patch literal 27304 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 literal 0 HcmV?d00001 diff --git a/docs/logo-swirl.svg b/docs/logo-swirl.svg new file mode 100644 index 00000000000..95ff28c6807 --- /dev/null +++ b/docs/logo-swirl.svg @@ -0,0 +1,64 @@ + + + + + + + + + +