// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
= Using GridGain Control Center With Apache Ignite

== Overview

https://www.gridgain.com/products/software/control-center[GridGain Control Center, window=_blank] is a management and
monitoring tool designed for Apache Ignite that allows you to do the following:

* Monitor the state of the cluster with customizable dashboards.
* Define custom alerts to track and react on over 200 cluster, node, and storage metrics.
* Execute and optimize SQL queries as well as monitor already running commands.
* Perform OpenCensus-based root cause analysis with visual debugging of API calls as they execute on nodes across the cluster.
* Take full, incremental, and continuous cluster backups to enable disaster recovery in the event of data loss or corruption.
* And more...

image::images/tools/gg-control-center.png[GridGain Contro Center]

== Installation and Usage

Refer to the https://www.gridgain.com/docs/control-center/latest/overview[official documentation of GridGain Control Center, window=_blank]
for detailed installation and usage instructions.
