Eu tenho um programa Java que grava linhas na minha tabela GridDB por meio da API NoSQL. Estou detectando erros corretamente e vejo nos logs que os dados estão sendo armazenados em meu contêiner via multiput, mas quando entro na CLI para visualizar o conteúdo dos dados, o contêiner está completamente vazio?
Primeiro, esta é a aparência do contêiner:
gs[public]> showcontainer LOG_agent_intrusion_exploit
Database : public
Name : LOG_agent_intrusion_exploit
Type : COLLECTION
Partition ID: 22
DataAffinity: -
Partitioned : true
Partition Type : INTERVAL
Partition Column : timestamp
Partition Interval Value : 30
Partition Interval Unit : DAY
Expiration Type : PARTITION
Expiration Time : 30
Expiration Time Unit : DAY
Columns:
No Name Type CSTR RowKey
------------------------------------------------------------------------------
0 timestamp TIMESTAMP(3) NN
1 username STRING
2 incomingIP STRING
3 serverIP STRING
4 mtu INTEGER
5 statusCode INTEGER
6 cacheHit STRING
7 method STRING
8 url STRING
9 urlPrefix STRING
10 urlSuffix STRING
11 httpVersion STRING
12 service STRING
13 riskLevel STRING
14 headerContentType STRING
15 bytesReceived INTEGER
16 bytesSent INTEGER
17 headerAgent STRING
18 url2 STRING
19 url2Prefix STRING
20 url2Suffix STRING
21 meta1 STRING
22 meta2 STRING
23 meta3 STRING
24 meta4 STRING
Meu analisador de log está criando um hashmap com os nomes dos contêineres como nome da chave, reunindo todas as linhas e, em seguida, usando store.multiPut para enviar para o GridDB. para esta função, estou fazendo um bloco try/catch simples que normalmente captura os erros do GridDB.
Trecho rápido:
for (RawLog log : logs) {
try {
System.out.println(log.logtype + "~~~~~~");
System.out.println("configs.get(log.logtype)" + configs.get(log.logtype));
Row row = lp.patternMatcher(proc_container, log, configs.get(log.logtype));
if (row != null) {
proc_logs.add(row);
System.out.println("parsing this row: " + row);
} else
System.out.println("Could not parse " + log);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Could not parse " + log);
}
}
containerRowsMap.put(proc_container, proc_logs);
}
try {
db.store.multiPut(containerRowsMap);
} catch (Exception e) {
System.out.println("Error with inserting data");
e.printStackTrace();
}
Portanto, neste caso, parece que os dados deveriam estar na minha tabela, mas quando executo uma consulta simples select * from LOG_agent_intrusion_exploit;
, recebo zero linhas de volta.
Tentei abandonar o multiput e inserir uma linha por vez, mas obtive exatamente o mesmo comportamento.
ATUALIZAÇÃO: consegui descobrir isso. Acontece que eu tinha algumas regras de expiração definidas para 30 dias (já que minhas linhas de dados expiram a cada 30 dias), mas estava ingerindo dados muito mais antigos do que isso (cerca de 10 anos). E então o GridDB estava ingerindo os dados e eles estavam lá, só que o cluster GridDB estava fazendo seu trabalho ao expirar as linhas, tornando-as ilegíveis (e possivelmente excluídas, não tenho certeza da rapidez com que esse processo ocorre)
Portanto, a solução foi simplesmente remover as regras de expiração ou torná-las longas o suficiente para que os dados de dez anos não fossem imediatamente eliminados.