首先,明确一下,zico将收到的agent端的数据存储在zico/data文件下,目录结构如下图所示:
tdat中存储的是host列表。
tidx:***
symbol.dat***
trace.db****
HostStore类代表一个agent的性能数据的存储(Represents performance data store for a single agent)。我们可以根据以下代码分析目录结构
public synchronized void open() { try { load(); if (symbolRegistry == null) { symbolRegistry = new PersistentSymbolRegistry( new File(ZicoUtil.ensureDir(rootPath), "symbols.dat")); } if (traceDataStore == null) { traceDataStore = new TraceRecordStore(config, this, "tdat", 1, this); } if (traceIndexStore == null) { traceIndexStore = new TraceRecordStore(config, this, "tidx", 4); } db = dbf.openDB(ZorkaUtil.path(rootPath, "traces.db")); infos = db.getTreeMap(DB_INFO_MAP); tids = db.getTreeMap(DB_TIDS_MAP); attrs = db.getTreeMap(DB_ATTR_MAP); } catch (IOException e) { log.error("Cannot open host store " + name, e); } }
PersistentSymbolRegistry类继承自SymbolRegistry类,而SymbolRegistry类中包含了两个Map(symbolIds以及symbolNames)。PersistentSymbolRegistry类中的open()方法会从symbol.dat文件中读取symbol,并put进symbolIds和symbolNames。
TraceReocrdStore类在其构造函数中会新建一个RSSsotre(Raw Data Store (RDS) builds upon RAGZ stream classes)对象。在RSSsotre的open()方法中,会建立RAGZInputStream和RAGZOutputStream来读写RAGZSegment(represents a single in-memory segment)。RAGZSegment类有unpack()方法对数据进行解压,此处调用了java.util.zip包。
对于trace.db文件使用了使用了org.parboiled.BaseParser。 http://parboiled.org。这是一个轻量级no-SQL数据库。
接下来应该弄清楚两点,第一,目录下每个文件中都存储的是什么信息 第二,什么地方用了HostStore.
--------------------------------------------------------------------------------------------------------------------------------------------------------------
在zico-core包的pom文件中, 有以下语句
<dependency> <groupId>org.mapdb</groupId> <artifactId>mapdb</artifactId> <version>${mapdb.version}</version> </dependency>
此处将mapdb导入了maven项目。
DataReceptionUnitTest中可以看到HostStore中包含一个SymbolRegistry。
在解析表达式方面,使用了org.parboiled.BaseParser。 http://parboiled.org
tdat中存储的是host列表。