cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Parse GraphQL queries with DQL

mmsz
Observer

Hi,

Does anyone know if there's a way to dynamically parse graphQL queries with DQL with the idea to extract the fields that is requested in the query?
I'm trying to use the request payload, but also extract the fields from response would be possible.

The problem is that, there's no pattern, the query can come with differents fields and orders. Bellow I have some examples:

{ clientePorConta(numeroConta: \"1234\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }

{ cliente(cpf: "1234") { dadosSociais { numeroConta, statusConta } } }


{ cliente(cpf: "12345") { contaCartao { contratos { numeroConta, statusConta, cartoes { id, numeroCartao, numeroCartaoCompleto, statusCartao, ehPrimario, nomeCartao, nomePortador } } } } }


{ cliente(cpf: "12345") { cpf, dadosSociais { numeroConta, dataDeNascimento, nomeCompleto, nomePrimeiro, nomeMeio, nomeUltimo, nomeSocial, nomeMae, genero }, contaCartao { contratos { statusConta, unidadeNegocio, numeroConta, tipoEnvioFatura } } } }

{ cliente(cpf: "1234") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, ehPrimario, idProduto } } } } }


{ cliente(cpf: "1234") { cpf, dadosSociais { nomeCompleto, numeroConta, tipoEnvioFatura, funcao, dataDeNascimento }, contato { dadosContato { numeroConta, emails { endereco }, telefones { ddd, numero, celularSeguro, tipo }, enderecos { uF, cidade, tipoEndereco } } }, contaCartao { contratos { codigoProdutoCurto, numeroConta, unidadeNegocio, statusConta, dataAberturaConta, valorLimiteTotal, cartoes { id, nomePortador, statusCartao, numeroCartao, numeroCartaoCompleto, ehPrimario, ehAtivo, tipoTitularidade, ehVirtual } } } } }


I was able to extract some fileds but from one case:

data 
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }")
| parse text, "DATA 'numeroConta: ' DQS:numero_conta"
| parse text, "DATA 'valorLimiteTotal: ' DQS:valorLimiteTotal"
| fieldsAdd  new_text=replaceString(text, "{", "<")
| fieldsAdd  new_text=replaceString(new_text, "}", ">")
| fieldsAdd  new_text=replaceString(new_text, " ", "")
| parse new_text, "DATA 'contratos<' [^<]*:contratos_arr"
| fieldsAdd contratos_arr=splitString(contratos_arr, ",")
| expand contratos_arr

 

If anyone has a better DQL.

 

1 REPLY 1

Eric_Yu
Dynatrace Mentor
Dynatrace Mentor

I'd suggest you go straight to the response, since there's the actual data you want, and we have support to parse JSON objects fairly easy with just a simple:

| parse json_data, "JSON:data"

And you can explore all the fields you have from there. Example:

Eric_Yu_0-1726005449137.png

If you really need to get the identifier of the user from the request from the graphql query structure, you can use alternative groups to cover multiple scenarios. Following your example, this might work:

| parse text, "'{ ' ('cliente'|'clientePorConta') '(' LDATA:identifierType ': \"' LDATA:identifier '\"' DATA"

I tried it with 3 of your scenarios and it worked decently:

Eric_Yu_1-1726005688146.png

Let me know if it helps

Eric Yu | LATAM ACE Consultant

Featured Posts