通过InfluxDB时序数据库,用Grafana进行一个项目的监控 记录

本文主要是记录给自己以后看的。因为一路做过来有很多坑。所以可能记录的不完整。但大体上思路是这样。

因为学业繁忙,以后有机会再写详细点。

 

第一部分:安装InfluxDB数据库

InfluxDB数据库是一种时序数据库。针对它的一些优缺点,这里不一一展开,不然能写几万字。针对具体用法以后在写。

我们从网上下载InfluxDB的压缩包后,直接解压缩,配置下文件就可使用了。很简单。

我们把它解压下来就可以了,我直接放到了C盘根目录下。

下面是InfluxDB的文件

其实InfluxDB很简单,跟redis类似,也是解压并配置下文件就可使用。下面我们简单配置下文件。

打开 influxdb.conf 后,根据这位大神的解释来看你是否需要打开的一些操作。

我当时就是参考这个的。这里不详细了,大同小异的东西。需要用到哪个,把前面的#去掉就行。

默认情况下监听端口是8088

我们用cmd打开influxd.exe ,看到下面的图,就意味着成功开启InfluxDB了, 下面就可以使用客户端influx.exe来自己使用cmd操作InfluxDB数据库了。

这边我贴个代码吧。也是参考别人的。

public class InfluxDBConnection {
	// 用户名
		private String username;
		// 密码
		private String password;
		// 连接地址
		private String openurl;
		// 数据库
		private String database;
		// 保留策略
		private String retentionPolicy;

		private InfluxDB influxDB;

		public InfluxDBConnection(String username, String password, String openurl, String database,
				String retentionPolicy) {
			this.username = username;
			this.password = password;
			this.openurl = openurl;
			this.database = database;
			this.retentionPolicy = retentionPolicy == null || retentionPolicy.equals("") ? "autogen" : retentionPolicy;
			influxDbBuild();
		}

		/**
		 * 创建数据库
		 * 
		 * @param dbName
		 */
		@SuppressWarnings("deprecation")
		public void createDB(String dbName) {
			influxDB.createDatabase(dbName);
		}

		/**
		 * 删除数据库
		 * 
		 * @param dbName
		 */
		@SuppressWarnings("deprecation")
		public void deleteDB(String dbName) {
			influxDB.deleteDatabase(dbName);
		}

		/**
		 * 测试连接是否正常
		 * 
		 * @return true 正常
		 */
		public boolean ping() {
			boolean isConnected = false;
			Pong pong;
			try {
				pong = influxDB.ping();
				if (pong != null) {
					isConnected = true;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			return isConnected;
		}

		/**
		 * 连接时序数据库 ,若不存在则创建
		 * 
		 * @return
		 */
		public InfluxDB influxDbBuild() {
			if (influxDB == null) {
				influxDB = InfluxDBFactory.connect(openurl, username, password);
			}
			try {
				// if (!influxDB.databaseExists(database)) {
				// influxDB.createDatabase(database);
				// }
			} catch (Exception e) {
				// 该数据库可能设置动态代理,不支持创建数据库
				// e.printStackTrace();
			} finally {
				influxDB.setRetentionPolicy(retentionPolicy);
			}
			influxDB.setLogLevel(InfluxDB.LogLevel.NONE);
			return influxDB;
		}

		/**
		 * 创建自定义保留策略
		 * 
		 * @param policyName
		 *            策略名
		 * @param duration
		 *            保存天数
		 * @param replication
		 *            保存副本数量
		 * @param isDefault
		 *            是否设为默认保留策略
		 */
		public void createRetentionPolicy(String policyName, String duration, int replication, Boolean isDefault) {
			String sql = String.format("CREATE RETENTION POLICY \"%s\" ON \"%s\" DURATION %s REPLICATION %s ", policyName,
					database, duration, replication);
			if (isDefault) {
				sql = sql + " DEFAULT";
			}
			this.query(sql);
		}

		/**
		 * 创建默认的保留策略
		 * 
		 * @param 策略名:default,保存天数:30天,保存副本数量:1
		 *            设为默认保留策略
		 */
		public void createDefaultRetentionPolicy() {
			String command = String.format("CREATE RETENTION POLICY \"%s\" ON \"%s\" DURATION %s REPLICATION %s DEFAULT",
					"default", database, "30d", 1);
			this.query(command);
		}

		/**
		 * 查询
		 * 
		 * @param command
		 *            查询语句
		 * @return
		 */
		public QueryResult query(String command) {
			return influxDB.query(new Query(command, database));
		}

		/**
		 * 插入
		 * 
		 * @param measurement
		 *            表
		 * @param tags
		 *            标签
		 * @param fields
		 *            字段
		 */
		public void insert(String measurement, Map<String, String> tags, Map<String, Object> fields, long time,
				TimeUnit timeUnit) {
			Builder builder = Point.measurement(measurement);
			builder.tag(tags);
			builder.fields(fields);
			if (0 != time) {
				builder.time(time, timeUnit);
			}
			influxDB.write(database, retentionPolicy, builder.build());
		}

		/**
		 * 批量写入测点
		 * 
		 * @param batchPoints
		 */
		public void batchInsert(BatchPoints batchPoints) {
			influxDB.write(batchPoints);
			// influxDB.enableGzip();
			// influxDB.enableBatch(2000,100,TimeUnit.MILLISECONDS);
			// influxDB.disableGzip();
			// influxDB.disableBatch();
		}

		/**
		 * 批量写入数据
		 * 
		 * @param database
		 *            数据库
		 * @param retentionPolicy
		 *            保存策略
		 * @param consistency
		 *            一致性
		 * @param records
		 *            要保存的数据(调用BatchPoints.lineProtocol()可得到一条record)
		 */
		public void batchInsert(final String database, final String retentionPolicy, final ConsistencyLevel consistency,
				final List<String> records) {
			influxDB.write(database, retentionPolicy, consistency, records);
		}

		/**
		 * 删除
		 * 
		 * @param command
		 *            删除语句
		 * @return 返回错误信息
		 */
		public String deleteMeasurementData(String command) {
			QueryResult result = influxDB.query(new Query(command, database));
			return result.getError();
		}

		/**
		 * 关闭数据库
		 */
		public void close() {
			influxDB.close();
		}

		/**
		 * 构建Point
		 * 
		 * @param measurement
		 * @param time
		 * @param fields
		 * @return
		 */
		public Point pointBuilder(String measurement, long time, Map<String, String> tags, Map<String, Object> fields) {
			Point point = Point.measurement(measurement).time(time, TimeUnit.MILLISECONDS).tag(tags).fields(fields).build();
			return point;
		}
}

下面的代码是我自己的一个测试用例,在后面的Grafana中有用到。

这里注意下,InfluxDB给用户的默认账号密码都是admin,可以使用命令看下。具体啥命令我忘记了。。。。

简单介绍下下面的几个字段吧

test:  对应InfluxDB 中的数据库名

url:表示的是一个索引

valueurl:表示的是记录的值

上面两个就是以键值对的形式来存储的。具体怎么回事,使用客户端插入几条数据,再查询一下就知道了。

spider:是我的表名(measurements)

 

public class InfluxDBUtil {

	private InfluxDBConnection dbConnection = new InfluxDBConnection("admin", "admin", "http://127.0.0.1:8086", "test",
			null);

	@Test // 插入到监控的数据库 spider中
	public void InsertSpider() throws Exception {
		Random random = new Random();
		int i = Integer.MAX_VALUE;
		while (i > 0) {
			Thread.sleep(2000);
			Map<String, String> tags=new HashMap<String, String>();
			tags.put("url","cc");
			Map<String, Object> fields=new HashMap<String, Object>();
			fields.put("valueurl", random.nextInt(100)+1);
			dbConnection.insert("spider", tags, fields, System.currentTimeMillis(), TimeUnit.MILLISECONDS);
			i--;
			System.out.println(i);
		}
		System.out.println("插入成功 ");
	}


}

这里贴个InfluxDB的一些常用操作,可以参考。

再贴个讲的比较好的。

好了,上面就是InfluxDB的一个非常简要的操作,写的不具体,如果看不明白,或者有需要帮助的在评论中留言,我看到了肯定会给回复了。


第二部分 Grafana的使用

Windows 下的 Grafana安装非常简单。只需要几步即可。可以看这里。

首先我们把Grafana下载下来,然后解压。我依然是解压在c盘根目录。

解压下如图所示:

 

接下来我们进到conf文件夹中可以看到:

如果你忽略官网建议的先复制一份defaults.ini,重命名再使用的话,它默认直接使用defaults.ini里面的配置 ,所以可以不用管。

接下来我们修改下sample.ini里面的内容。我的修改如下:  自己对着改改就好。

3000 就是Grafana使用的端口。

这里面的type无所谓的,可以不用改。

接下来比较重要,我们直接用 命令行打开Grafana的服务器会报错的。

这时我们需要一个工具来帮助我们把Grafana的服务添加到系统服务中去,就是NSSM

先下载一个NSSM :下载地址

下载NSSM解压后,到win64下有一个nssm.exe文件。

使用cmd直接打开nssm.exe,它会让你填写路径,按要求填写完即可。

按要求把Grafana的对应目录填写上点击Install service即可。。。杀毒软件提示请允许。

出现下面这个提示,说明你的Grafana安装成功了!。

接下来,在cmd下(注意目录),执行nssm start grafana 命令即可。

我们可以看到Grafana已经成功添加到了系统服务里面去了。

 

 

后面浏览器直接输入:http://localhost:3000  就可以看到我下面的这个页面了! 

账号,密码都是admin,输入 进去后

 

 

好了,成功了,下面简单讲下里面的使用。

首先我们得要添加一个数据库,让Grafana能够监听到数据库的端口

点进去,把箭头指向的字段都填起来即可。很简单。就是些数据库的url,数据库名称,自己数据库的账号,密码等 。

输入完会自己提示成功的!这一部完成以后接下去就是个绑定数据的问题了。

 

数据库设置好了以后自己选一个dashboard即可。然后就是填充数据库的数据了。。

当你用我前面第一部分的测试代码把数据插入到这里以后,这么设置:

要是看不懂的话直接点右边Toggle Edit Mode 

把下面这串代码复制进来,即可,大同小异。

设置好了上面的步骤后,就可以看到下面这个监控图了。

当然有各种各样的dashboard,自己摸索就好。

 

最后,,,,,,我自己没弄明白怎么自动刷新,在下面的设置里,也写了5s更新,但没反应。。。。。希望有懂的朋友告诉我下,谢谢。。。。。。。

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值