mirror of
https://github.com/kubeshark/kubeshark.git
synced 2026-06-09 01:36:52 +00:00
Compare commits
16 Commits
31.0-dev33
...
31.0-dev47
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a527fc6c51 | ||
|
|
e104128df8 | ||
|
|
5bb904d068 | ||
|
|
1a5378b64b | ||
|
|
7cfe506897 | ||
|
|
ab64046e8e | ||
|
|
62cbcf8857 | ||
|
|
8f3b0e8fee | ||
|
|
32d473ea26 | ||
|
|
97000293fd | ||
|
|
3ed9bc1e0d | ||
|
|
86e5dcea19 | ||
|
|
81fe4af30d | ||
|
|
df1fd2c3a7 | ||
|
|
f8496c0235 | ||
|
|
2de7107c0a |
2
.github/workflows/acceptance_tests.yml
vendored
2
.github/workflows/acceptance_tests.yml
vendored
@@ -43,7 +43,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
status: ${{ job.status }}
|
status: ${{ job.status }}
|
||||||
notification_title: 'Mizu {workflow} has {status_message}'
|
notification_title: 'Mizu {workflow} has {status_message}'
|
||||||
message_format: '{emoji} *{workflow}* {status_message} during <{run_url}|run>, after commit <{commit_url}|{commit_sha}> by ${{ github.event.head_commit.committer.name }} <${{ github.event.head_commit.committer.email }}> ```${{ github.event.head_commit.message }}```'
|
message_format: '{emoji} *{workflow}* {status_message} during <{run_url}|run>, after commit <{commit_url}|{commit_sha}> by ${{ github.event.head_commit.author.name }} <${{ github.event.head_commit.author.email }}> ```${{ github.event.head_commit.message }}```'
|
||||||
footer: 'Linked Repo <{repo_url}|{repo}>'
|
footer: 'Linked Repo <{repo_url}|{repo}>'
|
||||||
notify_when: 'failure'
|
notify_when: 'failure'
|
||||||
env:
|
env:
|
||||||
|
|||||||
5
.github/workflows/inactive-issues-close.yaml
vendored
5
.github/workflows/inactive-issues-close.yaml
vendored
@@ -13,10 +13,11 @@ jobs:
|
|||||||
- uses: actions/stale@v3
|
- uses: actions/stale@v3
|
||||||
with:
|
with:
|
||||||
days-before-issue-stale: 30
|
days-before-issue-stale: 30
|
||||||
days-before-issue-close: 14
|
days-before-issue-close: -1
|
||||||
|
exempt-issue-labels: "enhancement"
|
||||||
stale-issue-label: "stale"
|
stale-issue-label: "stale"
|
||||||
stale-issue-message: "This issue is stale because it has been open for 30 days with no activity."
|
stale-issue-message: "This issue is stale because it has been open for 30 days with no activity."
|
||||||
close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
|
close-issue-message: ""
|
||||||
days-before-pr-stale: -1
|
days-before-pr-stale: -1
|
||||||
days-before-pr-close: -1
|
days-before-pr-close: -1
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -87,8 +87,8 @@ RUN go build -ldflags="-extldflags=-static -s -w \
|
|||||||
-X 'github.com/up9inc/mizu/agent/pkg/version.Ver=${VER}'" -o mizuagent .
|
-X 'github.com/up9inc/mizu/agent/pkg/version.Ver=${VER}'" -o mizuagent .
|
||||||
|
|
||||||
# Download Basenine executable, verify the sha1sum
|
# Download Basenine executable, verify the sha1sum
|
||||||
ADD https://github.com/up9inc/basenine/releases/download/v0.6.6/basenine_linux_${GOARCH} ./basenine_linux_${GOARCH}
|
ADD https://github.com/up9inc/basenine/releases/download/v0.7.2/basenine_linux_${GOARCH} ./basenine_linux_${GOARCH}
|
||||||
ADD https://github.com/up9inc/basenine/releases/download/v0.6.6/basenine_linux_${GOARCH}.sha256 ./basenine_linux_${GOARCH}.sha256
|
ADD https://github.com/up9inc/basenine/releases/download/v0.7.2/basenine_linux_${GOARCH}.sha256 ./basenine_linux_${GOARCH}.sha256
|
||||||
|
|
||||||
RUN shasum -a 256 -c basenine_linux_"${GOARCH}".sha256 && \
|
RUN shasum -a 256 -c basenine_linux_"${GOARCH}".sha256 && \
|
||||||
chmod +x ./basenine_linux_"${GOARCH}" && \
|
chmod +x ./basenine_linux_"${GOARCH}" && \
|
||||||
|
|||||||
@@ -39,13 +39,13 @@ export function verifyMinimumEntries() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function leftTextCheck(entryNum, path, expectedText) {
|
export function leftTextCheck(entryId, path, expectedText) {
|
||||||
cy.get(`#list #entry-${entryNum} ${path}`).invoke('text').should('eq', expectedText);
|
cy.get(`#list #entry-${entryId} ${path}`).invoke('text').should('eq', expectedText);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function leftOnHoverCheck(entryNum, path, filterName) {
|
export function leftOnHoverCheck(entryId, path, filterName) {
|
||||||
cy.get(`#list #entry-${entryNum} ${path}`).trigger('mouseover');
|
cy.get(`#list #entry-${entryId} ${path}`).trigger('mouseover');
|
||||||
cy.get(`#list #entry-${entryNum} [data-cy='QueryableTooltip']`).invoke('text').should('match', new RegExp(filterName));
|
cy.get(`#list #entry-${entryId} [data-cy='QueryableTooltip']`).invoke('text').should('match', new RegExp(filterName));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function rightTextCheck(path, expectedText) {
|
export function rightTextCheck(path, expectedText) {
|
||||||
@@ -89,13 +89,13 @@ export function checkFilterByMethod(funcDict) {
|
|||||||
cy.get('#entries-length').invoke('text').then(len => {
|
cy.get('#entries-length').invoke('text').then(len => {
|
||||||
resizeIfNeeded(len);
|
resizeIfNeeded(len);
|
||||||
listElmWithIdAttr.forEach(entry => {
|
listElmWithIdAttr.forEach(entry => {
|
||||||
if (entry?.id && entry.id.match(RegExp(/entry-(\d{2}|\d{1})$/gm))) {
|
if (entry?.id && entry.id.match(RegExp(/entry-(\d{24})$/gm))) {
|
||||||
const entryNum = getEntryNumById(entry.id);
|
const entryId = getEntryId(entry.id);
|
||||||
|
|
||||||
leftTextCheck(entryNum, methodDict.pathLeft, methodDict.expectedText);
|
leftTextCheck(entryId, methodDict.pathLeft, methodDict.expectedText);
|
||||||
leftTextCheck(entryNum, protocolDict.pathLeft, protocolDict.expectedTextLeft);
|
leftTextCheck(entryId, protocolDict.pathLeft, protocolDict.expectedTextLeft);
|
||||||
if (summaryDict)
|
if (summaryDict)
|
||||||
leftTextCheck(entryNum, summaryDict.pathLeft, summaryDict.expectedText);
|
leftTextCheck(entryId, summaryDict.pathLeft, summaryDict.expectedText);
|
||||||
|
|
||||||
if (!doneCheckOnFirst) {
|
if (!doneCheckOnFirst) {
|
||||||
deepCheck(funcDict, protocolDict, methodDict, entry);
|
deepCheck(funcDict, protocolDict, methodDict, entry);
|
||||||
@@ -111,6 +111,11 @@ export function checkFilterByMethod(funcDict) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getEntryId(id) {
|
||||||
|
// take the second part from the string (entry-<ID>)
|
||||||
|
return id.split('-')[1];
|
||||||
|
}
|
||||||
|
|
||||||
function resizeIfNeeded(entriesLen) {
|
function resizeIfNeeded(entriesLen) {
|
||||||
if (entriesLen > maxEntriesInDom){
|
if (entriesLen > maxEntriesInDom){
|
||||||
Cypress.config().viewportHeight === Cypress.env('normalMizuHeight') ?
|
Cypress.config().viewportHeight === Cypress.env('normalMizuHeight') ?
|
||||||
@@ -119,14 +124,14 @@ function resizeIfNeeded(entriesLen) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function deepCheck(generalDict, protocolDict, methodDict, entry) {
|
function deepCheck(generalDict, protocolDict, methodDict, entry) {
|
||||||
const entryNum = getEntryNumById(entry.id);
|
const entryId = getEntryId(entry.id);
|
||||||
const {summary, value} = generalDict;
|
const {summary, value} = generalDict;
|
||||||
const summaryDict = getSummaryDict(summary);
|
const summaryDict = getSummaryDict(summary);
|
||||||
|
|
||||||
leftOnHoverCheck(entryNum, methodDict.pathLeft, methodDict.expectedOnHover);
|
leftOnHoverCheck(entryId, methodDict.pathLeft, methodDict.expectedOnHover);
|
||||||
leftOnHoverCheck(entryNum, protocolDict.pathLeft, protocolDict.expectedOnHover);
|
leftOnHoverCheck(entryId, protocolDict.pathLeft, protocolDict.expectedOnHover);
|
||||||
if (summaryDict)
|
if (summaryDict)
|
||||||
leftOnHoverCheck(entryNum, summaryDict.pathLeft, summaryDict.expectedOnHover);
|
leftOnHoverCheck(entryId, summaryDict.pathLeft, summaryDict.expectedOnHover);
|
||||||
|
|
||||||
cy.get(`#${entry.id}`).click();
|
cy.get(`#${entry.id}`).click();
|
||||||
|
|
||||||
@@ -183,7 +188,3 @@ function getProtocolDict(protocol, protocolText) {
|
|||||||
expectedOnHover: protocol.toLowerCase()
|
expectedOnHover: protocol.toLowerCase()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getEntryNumById (id) {
|
|
||||||
return parseInt(id.split('-')[1]);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -15,15 +15,11 @@ function checkEntries() {
|
|||||||
checkThatAllEntriesShown();
|
checkThatAllEntriesShown();
|
||||||
resizeToHugeMizu();
|
resizeToHugeMizu();
|
||||||
|
|
||||||
cy.get('#total-entries').then(number => {
|
cy.get('#list [id^=entry]').each(entryElement => {
|
||||||
const numOfEntries = parseInt(number.text());
|
entryElement.click();
|
||||||
[...Array(numOfEntries).keys()].map(checkEntry);
|
cy.get('#tbody-Headers').should('be.visible');
|
||||||
|
isValueExistsInElement(false, 'Ignored-User-Agent', '#tbody-Headers');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkEntry(entryIndex) {
|
|
||||||
cy.get(`#entry-${entryIndex}`).click();
|
|
||||||
cy.get('#tbody-Headers').should('be.visible');
|
|
||||||
isValueExistsInElement(false, 'Ignored-User-Agent', '#tbody-Headers');
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import {findLineAndCheck, getExpectedDetailsDict} from "../testHelpers/StatusBarHelper";
|
import {findLineAndCheck, getExpectedDetailsDict} from "../testHelpers/StatusBarHelper";
|
||||||
import {
|
import {
|
||||||
|
getEntryId,
|
||||||
leftOnHoverCheck,
|
leftOnHoverCheck,
|
||||||
leftTextCheck,
|
leftTextCheck,
|
||||||
resizeToHugeMizu,
|
resizeToHugeMizu,
|
||||||
@@ -148,9 +149,6 @@ function checkFilterNoResults(filterName) {
|
|||||||
// the DOM should show 0 entries
|
// the DOM should show 0 entries
|
||||||
cy.get('#entries-length').should('have.text', '0');
|
cy.get('#entries-length').should('have.text', '0');
|
||||||
|
|
||||||
// going through every potential entry and verifies that it doesn't exist
|
|
||||||
[...Array(parseInt(totalEntries)).keys()].map(shouldNotExist);
|
|
||||||
|
|
||||||
cy.get('[title="Fetch old records"]').click();
|
cy.get('[title="Fetch old records"]').click();
|
||||||
cy.get('#noMoreDataTop', {timeout: refreshWaitTimeout}).should('be.visible');
|
cy.get('#noMoreDataTop', {timeout: refreshWaitTimeout}).should('be.visible');
|
||||||
cy.get('#entries-length').should('have.text', '0'); // after loading all entries there should still be 0 entries
|
cy.get('#entries-length').should('have.text', '0'); // after loading all entries there should still be 0 entries
|
||||||
@@ -162,10 +160,6 @@ function checkFilterNoResults(filterName) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function shouldNotExist(entryNum) {
|
|
||||||
cy.get(`entry-${entryNum}`).should('not.exist');
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkIllegalFilter(illegalFilterName) {
|
function checkIllegalFilter(illegalFilterName) {
|
||||||
it(`should show red search bar with the input: ${illegalFilterName}`, function () {
|
it(`should show red search bar with the input: ${illegalFilterName}`, function () {
|
||||||
cy.reload();
|
cy.reload();
|
||||||
@@ -185,30 +179,44 @@ function checkIllegalFilter(illegalFilterName) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function checkFilter(filterDetails){
|
|
||||||
const {name, leftSidePath, rightSidePath, rightSideExpectedText, leftSideExpectedText, applyByEnter} = filterDetails;
|
function checkFilter(filterDetails) {
|
||||||
|
const {
|
||||||
|
name,
|
||||||
|
leftSidePath,
|
||||||
|
rightSidePath,
|
||||||
|
rightSideExpectedText,
|
||||||
|
leftSideExpectedText,
|
||||||
|
applyByEnter
|
||||||
|
} = filterDetails;
|
||||||
|
|
||||||
const entriesForDeeperCheck = 5;
|
const entriesForDeeperCheck = 5;
|
||||||
|
|
||||||
it(`checking the filter: ${name}`, function () {
|
it(`checking the filter: ${name}`, function () {
|
||||||
cy.get('#total-entries').should('not.have.text', '0').then(number => {
|
cy.get('#total-entries').should('not.have.text', '0').then(number => {
|
||||||
const totalEntries = number.text();
|
const totalEntries = number.text();
|
||||||
|
|
||||||
// checks the hover on the last entry (the only one in DOM at the beginning)
|
cy.get(`#list [id^=entry]`).last().then(elem => {
|
||||||
leftOnHoverCheck(totalEntries - 1, leftSidePath, name);
|
const element = elem[0];
|
||||||
|
const entryId = getEntryId(element.id);
|
||||||
|
// checks the hover on the last entry (the only one in DOM at the beginning)
|
||||||
|
leftOnHoverCheck(entryId, leftSidePath, name);
|
||||||
|
|
||||||
cy.get('.w-tc-editor-text').clear();
|
cy.get('.w-tc-editor-text').clear();
|
||||||
// applying the filter with alt+enter or with the button
|
// applying the filter with alt+enter or with the button
|
||||||
cy.get('.w-tc-editor-text').type(`${name}${applyByEnter ? '{alt+enter}' : ''}`);
|
cy.get('.w-tc-editor-text').type(`${name}${applyByEnter ? '{alt+enter}' : ''}`);
|
||||||
cy.get('.w-tc-editor').should('have.attr', 'style').and('include', Cypress.env('greenFilterColor'));
|
cy.get('.w-tc-editor').should('have.attr', 'style').and('include', Cypress.env('greenFilterColor'));
|
||||||
if (!applyByEnter)
|
if (!applyByEnter)
|
||||||
cy.get('[type="submit"]').click();
|
cy.get('[type="submit"]').click();
|
||||||
|
|
||||||
// only one entry in DOM after filtering, checking all checks on it
|
// only one entry in DOM after filtering, checking all checks on it
|
||||||
leftTextCheck(totalEntries - 1, leftSidePath, leftSideExpectedText);
|
leftTextCheck(entryId, leftSidePath, leftSideExpectedText);
|
||||||
leftOnHoverCheck(totalEntries - 1, leftSidePath, name);
|
leftOnHoverCheck(entryId, leftSidePath, name);
|
||||||
rightTextCheck(rightSidePath, rightSideExpectedText);
|
|
||||||
rightOnHoverCheck(rightSidePath, name);
|
rightTextCheck(rightSidePath, rightSideExpectedText);
|
||||||
checkRightSideResponseBody();
|
rightOnHoverCheck(rightSidePath, name);
|
||||||
|
checkRightSideResponseBody();
|
||||||
|
});
|
||||||
|
|
||||||
cy.get('[title="Fetch old records"]').click();
|
cy.get('[title="Fetch old records"]').click();
|
||||||
resizeToHugeMizu();
|
resizeToHugeMizu();
|
||||||
@@ -217,28 +225,33 @@ function checkFilter(filterDetails){
|
|||||||
cy.get('#entries-length', {timeout: refreshWaitTimeout}).should('have.text', totalEntries);
|
cy.get('#entries-length', {timeout: refreshWaitTimeout}).should('have.text', totalEntries);
|
||||||
|
|
||||||
// checking only 'leftTextCheck' on all entries because the rest of the checks require more time
|
// checking only 'leftTextCheck' on all entries because the rest of the checks require more time
|
||||||
[...Array(parseInt(totalEntries)).keys()].forEach(entryNum => {
|
cy.get(`#list [id^=entry]`).each(elem => {
|
||||||
leftTextCheck(entryNum, leftSidePath, leftSideExpectedText);
|
const element = elem[0];
|
||||||
|
let entryId = getEntryId(element.id);
|
||||||
|
leftTextCheck(entryId, leftSidePath, leftSideExpectedText);
|
||||||
});
|
});
|
||||||
|
|
||||||
// making the other 3 checks on the first X entries (longer time for each check)
|
// making the other 3 checks on the first X entries (longer time for each check)
|
||||||
deeperChcek(leftSidePath, rightSidePath, name, leftSideExpectedText, rightSideExpectedText, entriesForDeeperCheck);
|
deeperCheck(leftSidePath, rightSidePath, name, leftSideExpectedText, rightSideExpectedText, entriesForDeeperCheck);
|
||||||
|
|
||||||
// reloading then waiting for the entries number to load
|
// reloading then waiting for the entries number to load
|
||||||
resizeToNormalMizu();
|
resizeToNormalMizu();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
cy.get('#total-entries', {timeout: refreshWaitTimeout}).should('have.text', totalEntries);
|
cy.get('#total-entries', {timeout: refreshWaitTimeout}).should('have.text', totalEntries);
|
||||||
});
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function deeperChcek(leftSidePath, rightSidePath, filterName, leftSideExpectedText, rightSideExpectedText, entriesNumToCheck) {
|
function deeperCheck(leftSidePath, rightSidePath, filterName, leftSideExpectedText, rightSideExpectedText, entriesNumToCheck) {
|
||||||
[...Array(entriesNumToCheck).keys()].forEach(entryNum => {
|
cy.get(`#list [id^=entry]`).each((element, index) => {
|
||||||
leftOnHoverCheck(entryNum, leftSidePath, filterName);
|
if (index < entriesNumToCheck) {
|
||||||
|
const entryId = getEntryId(element[0].id);
|
||||||
|
leftOnHoverCheck(entryId, leftSidePath, filterName);
|
||||||
|
|
||||||
cy.get(`#list #entry-${entryNum}`).click();
|
cy.get(`#list #entry-${entryId}`).click();
|
||||||
rightTextCheck(rightSidePath, rightSideExpectedText);
|
rightTextCheck(rightSidePath, rightSideExpectedText);
|
||||||
rightOnHoverCheck(rightSidePath, filterName);
|
rightOnHoverCheck(rightSidePath, filterName);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ require (
|
|||||||
github.com/orcaman/concurrent-map v1.0.0
|
github.com/orcaman/concurrent-map v1.0.0
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible
|
github.com/patrickmn/go-cache v2.1.0+incompatible
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.0
|
||||||
github.com/up9inc/basenine/client/go v0.0.0-20220326121918-785f3061c8ce
|
github.com/up9inc/basenine/client/go v0.0.0-20220413173135-69508ca741d7
|
||||||
github.com/up9inc/mizu/shared v0.0.0
|
github.com/up9inc/mizu/shared v0.0.0
|
||||||
github.com/up9inc/mizu/tap v0.0.0
|
github.com/up9inc/mizu/tap v0.0.0
|
||||||
github.com/up9inc/mizu/tap/api v0.0.0
|
github.com/up9inc/mizu/tap/api v0.0.0
|
||||||
|
|||||||
@@ -683,8 +683,8 @@ github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn
|
|||||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||||
github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ=
|
github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ=
|
||||||
github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
|
github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
|
||||||
github.com/up9inc/basenine/client/go v0.0.0-20220326121918-785f3061c8ce h1:vMTCpKItc9OyTLJXocNaq2NcBU5EnurJgTVOYb8W8dw=
|
github.com/up9inc/basenine/client/go v0.0.0-20220413173135-69508ca741d7 h1:9aciby1Byjn50gVXpOuvWSe48GdSK1uS2bcBKMZYHKI=
|
||||||
github.com/up9inc/basenine/client/go v0.0.0-20220326121918-785f3061c8ce/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI=
|
github.com/up9inc/basenine/client/go v0.0.0-20220413173135-69508ca741d7/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI=
|
||||||
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg=
|
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg=
|
||||||
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||||
github.com/wI2L/jsondiff v0.1.1 h1:r2TkoEet7E4JMO5+s1RCY2R0LrNPNHY6hbDeow2hRHw=
|
github.com/wI2L/jsondiff v0.1.1 h1:r2TkoEet7E4JMO5+s1RCY2R0LrNPNHY6hbDeow2hRHw=
|
||||||
|
|||||||
@@ -5,13 +5,14 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/up9inc/mizu/agent/pkg/models"
|
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/up9inc/mizu/agent/pkg/models"
|
||||||
|
|
||||||
"github.com/up9inc/mizu/agent/pkg/dependency"
|
"github.com/up9inc/mizu/agent/pkg/dependency"
|
||||||
"github.com/up9inc/mizu/agent/pkg/elastic"
|
"github.com/up9inc/mizu/agent/pkg/elastic"
|
||||||
"github.com/up9inc/mizu/agent/pkg/har"
|
"github.com/up9inc/mizu/agent/pkg/har"
|
||||||
@@ -104,9 +105,11 @@ func startReadingChannel(outputItems <-chan *tapApi.OutputChannelItem, extension
|
|||||||
|
|
||||||
connection, err := basenine.NewConnection(shared.BasenineHost, shared.BaseninePort)
|
connection, err := basenine.NewConnection(shared.BasenineHost, shared.BaseninePort)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
logger.Log.Panicf("Can't establish a new connection to Basenine server: %v", err)
|
||||||
|
}
|
||||||
|
if err = connection.InsertMode(); err != nil {
|
||||||
|
logger.Log.Panicf("Insert mode call failed: %v", err)
|
||||||
}
|
}
|
||||||
connection.InsertMode()
|
|
||||||
|
|
||||||
disableOASValidation := false
|
disableOASValidation := false
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
@@ -148,7 +151,9 @@ func startReadingChannel(outputItems <-chan *tapApi.OutputChannelItem, extension
|
|||||||
|
|
||||||
providers.EntryAdded(len(data))
|
providers.EntryAdded(len(data))
|
||||||
|
|
||||||
connection.SendText(string(data))
|
if err = connection.SendText(string(data)); err != nil {
|
||||||
|
logger.Log.Panicf("An error occured while inserting a new record to database: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
serviceMapGenerator := dependency.GetInstance(dependency.ServiceMapGeneratorDependency).(servicemap.ServiceMapSink)
|
serviceMapGenerator := dependency.GetInstance(dependency.ServiceMapGeneratorDependency).(servicemap.ServiceMapSink)
|
||||||
serviceMapGenerator.NewTCPEntry(mizuEntry.Source, mizuEntry.Destination, &item.Protocol)
|
serviceMapGenerator.NewTCPEntry(mizuEntry.Source, mizuEntry.Destination, &item.Protocol)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ func (e *BasenineEntryStreamer) Get(ctx context.Context, socketId int, params *W
|
|||||||
var entry *tapApi.Entry
|
var entry *tapApi.Entry
|
||||||
err = json.Unmarshal(bytes, &entry)
|
err = json.Unmarshal(bytes, &entry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Log.Debugf("error unmarshalling entry: %v", err.Error())
|
logger.Log.Debugf("Error unmarshalling entry: %v", err.Error())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,9 @@ func (e *BasenineEntryStreamer) Get(ctx context.Context, socketId int, params *W
|
|||||||
go handleDataChannel(connection, data)
|
go handleDataChannel(connection, data)
|
||||||
go handleMetaChannel(connection, meta)
|
go handleMetaChannel(connection, meta)
|
||||||
|
|
||||||
connection.Query(query, data, meta)
|
if err = connection.Query(query, data, meta); err != nil {
|
||||||
|
logger.Log.Panicf("Query mode call failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
<-ctx.Done()
|
<-ctx.Done()
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ func ConfigureBasenineServer(host string, port string, dbSize int64, logLevel lo
|
|||||||
wait.WithProto("tcp"),
|
wait.WithProto("tcp"),
|
||||||
wait.WithWait(200*time.Millisecond),
|
wait.WithWait(200*time.Millisecond),
|
||||||
wait.WithBreak(50*time.Millisecond),
|
wait.WithBreak(50*time.Millisecond),
|
||||||
wait.WithDeadline(5*time.Second),
|
wait.WithDeadline(20*time.Second),
|
||||||
wait.WithDebug(logLevel == logging.DEBUG),
|
wait.WithDebug(logLevel == logging.DEBUG),
|
||||||
).Do([]string{fmt.Sprintf("%s:%s", host, port)}) {
|
).Do([]string{fmt.Sprintf("%s:%s", host, port)}) {
|
||||||
logger.Log.Panicf("Basenine is not available!")
|
logger.Log.Panicf("Basenine is not available!")
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/up9inc/mizu/agent/pkg/dependency"
|
"github.com/up9inc/mizu/agent/pkg/dependency"
|
||||||
"github.com/up9inc/mizu/agent/pkg/entries"
|
"github.com/up9inc/mizu/agent/pkg/entries"
|
||||||
@@ -69,7 +68,7 @@ func GetEntry(c *gin.Context) {
|
|||||||
c.JSON(http.StatusBadRequest, validationError)
|
c.JSON(http.StatusBadRequest, validationError)
|
||||||
}
|
}
|
||||||
|
|
||||||
id, _ := strconv.Atoi(c.Param("id"))
|
id := c.Param("id")
|
||||||
|
|
||||||
entriesProvider := dependency.GetInstance(dependency.EntriesProvider).(entries.EntriesProvider)
|
entriesProvider := dependency.GetInstance(dependency.EntriesProvider).(entries.EntriesProvider)
|
||||||
entry, err := entriesProvider.GetEntry(singleEntryRequest, id)
|
entry, err := entriesProvider.GetEntry(singleEntryRequest, id)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import (
|
|||||||
|
|
||||||
type EntriesProvider interface {
|
type EntriesProvider interface {
|
||||||
GetEntries(entriesRequest *models.EntriesRequest) ([]*tapApi.EntryWrapper, *basenine.Metadata, error)
|
GetEntries(entriesRequest *models.EntriesRequest) ([]*tapApi.EntryWrapper, *basenine.Metadata, error)
|
||||||
GetEntry(singleEntryRequest *models.SingleEntryRequest, entryId int) (*tapApi.EntryWrapper, error)
|
GetEntry(singleEntryRequest *models.SingleEntryRequest, entryId string) (*tapApi.EntryWrapper, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type BasenineEntriesProvider struct{}
|
type BasenineEntriesProvider struct{}
|
||||||
@@ -56,7 +56,7 @@ func (e *BasenineEntriesProvider) GetEntries(entriesRequest *models.EntriesReque
|
|||||||
return dataSlice, metadata, nil
|
return dataSlice, metadata, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *BasenineEntriesProvider) GetEntry(singleEntryRequest *models.SingleEntryRequest, entryId int) (*tapApi.EntryWrapper, error) {
|
func (e *BasenineEntriesProvider) GetEntry(singleEntryRequest *models.SingleEntryRequest, entryId string) (*tapApi.EntryWrapper, error) {
|
||||||
var entry *tapApi.Entry
|
var entry *tapApi.Entry
|
||||||
bytes, err := basenine.Single(shared.BasenineHost, shared.BaseninePort, entryId, singleEntryRequest.Query)
|
bytes, err := basenine.Single(shared.BasenineHost, shared.BaseninePort, entryId, singleEntryRequest.Query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type EntriesRequest struct {
|
type EntriesRequest struct {
|
||||||
LeftOff int `form:"leftOff" validate:"required,min=-1"`
|
LeftOff string `form:"leftOff" validate:"required"`
|
||||||
Direction int `form:"direction" validate:"required,oneof='1' '-1'"`
|
Direction int `form:"direction" validate:"required,oneof='1' '-1'"`
|
||||||
Query string `form:"query"`
|
Query string `form:"query"`
|
||||||
Limit int `form:"limit" validate:"required,min=1"`
|
Limit int `form:"limit" validate:"required,min=1"`
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/url"
|
"net/url"
|
||||||
@@ -124,13 +125,13 @@ func feedFromHAR(file string, isSync bool, gen *defaultOasGenerator) (uint, erro
|
|||||||
cnt := uint(0)
|
cnt := uint(0)
|
||||||
for _, entry := range harDoc.Log.Entries {
|
for _, entry := range harDoc.Log.Entries {
|
||||||
cnt += 1
|
cnt += 1
|
||||||
feedEntry(&entry, "", file, gen, cnt)
|
feedEntry(&entry, "", file, gen, fmt.Sprintf("%024d", cnt))
|
||||||
}
|
}
|
||||||
|
|
||||||
return cnt, nil
|
return cnt, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func feedEntry(entry *har.Entry, source string, file string, gen *defaultOasGenerator, cnt uint) {
|
func feedEntry(entry *har.Entry, source string, file string, gen *defaultOasGenerator, cnt string) {
|
||||||
entry.Comment = file
|
entry.Comment = file
|
||||||
if entry.Response.Status == 302 {
|
if entry.Response.Status == 302 {
|
||||||
logger.Log.Debugf("Dropped traffic entry due to permanent redirect status: %s", entry.StartedDateTime)
|
logger.Log.Debugf("Dropped traffic entry due to permanent redirect status: %s", entry.StartedDateTime)
|
||||||
@@ -192,7 +193,7 @@ func feedFromLDJSON(file string, isSync bool, gen *defaultOasGenerator) (uint, e
|
|||||||
logger.Log.Warningf("Failed decoding entry: %s", line)
|
logger.Log.Warningf("Failed decoding entry: %s", line)
|
||||||
} else {
|
} else {
|
||||||
cnt += 1
|
cnt += 1
|
||||||
feedEntry(&entry, source, file, gen, cnt)
|
feedEntry(&entry, source, file, gen, fmt.Sprintf("%024d", cnt))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
96
agent/pkg/oas/oas-samples/carts.json
Normal file
96
agent/pkg/oas/oas-samples/carts.json
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"openapi": "3.1.0",
|
||||||
|
"info": {
|
||||||
|
"title": "http://carts",
|
||||||
|
"description": "Mizu observed 3 entries (0 failed), at 2.287 hits/s, average response time is 0.017 seconds",
|
||||||
|
"version": "1.0"
|
||||||
|
},
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"url": "http://carts"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"paths": {
|
||||||
|
"/carts/{cartId}/items": {
|
||||||
|
"get": {
|
||||||
|
"summary": "/carts/{cartId}/items",
|
||||||
|
"description": "Mizu observed 3 entries (0 failed), at 2.287 hits/s, average response time is 0.017 seconds",
|
||||||
|
"operationId": "84c9b926-1f73-4ab4-b381-3c124528959f",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": [
|
||||||
|
{
|
||||||
|
"id": "60fe98fb86c0fc000869a90c",
|
||||||
|
"itemId": "3395a43e-2d88-40de-b95f-e00e1502085b",
|
||||||
|
"quantity": 1,
|
||||||
|
"unitPrice": 18
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"x-sample-entry": "000000000000000000000010"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000010"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"some-source": {
|
||||||
|
"entries": 3,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298058.3798368,
|
||||||
|
"lastSeen": 1627298065.2397773,
|
||||||
|
"sumRT": 0.05,
|
||||||
|
"sumDuration": 6.859940528869629
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 3,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298058.3798368,
|
||||||
|
"lastSeen": 1627298065.2397773,
|
||||||
|
"sumRT": 0.05,
|
||||||
|
"sumDuration": 6.859940528869629
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1627298065.2397773,
|
||||||
|
"x-sample-entry": "000000000000000000000010"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "cartId",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "mHK0P7zTktmV1zv57iWAvCTd43FFMHap"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000010"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"some-source": {
|
||||||
|
"entries": 3,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298058.3798368,
|
||||||
|
"lastSeen": 1627298065.2397773,
|
||||||
|
"sumRT": 0.05,
|
||||||
|
"sumDuration": 6.859940528869629
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 3,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298058.3798368,
|
||||||
|
"lastSeen": 1627298065.2397773,
|
||||||
|
"sumRT": 0.05,
|
||||||
|
"sumDuration": 6.859940528869629
|
||||||
|
}
|
||||||
|
}
|
||||||
485
agent/pkg/oas/oas-samples/catalogue.json
Normal file
485
agent/pkg/oas/oas-samples/catalogue.json
Normal file
@@ -0,0 +1,485 @@
|
|||||||
|
{
|
||||||
|
"openapi": "3.1.0",
|
||||||
|
"info": {
|
||||||
|
"title": "Preloaded",
|
||||||
|
"description": "Test file for loading pre-existing OAS",
|
||||||
|
"version": "0.1"
|
||||||
|
},
|
||||||
|
"paths": {
|
||||||
|
"/catalogue": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"catalogue"
|
||||||
|
],
|
||||||
|
"summary": "/catalogue",
|
||||||
|
"description": "Mizu observed 3 entries (0 failed), at 2.647 hits/s, average response time is 0.008 seconds",
|
||||||
|
"operationId": "dd6c3dbe-6b6b-4ddd-baed-757e237ddb8a",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "page",
|
||||||
|
"in": "query",
|
||||||
|
"required": false,
|
||||||
|
"style": "form",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000002"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "size",
|
||||||
|
"in": "query",
|
||||||
|
"required": true,
|
||||||
|
"style": "form",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "6"
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "3"
|
||||||
|
},
|
||||||
|
"example #2": {
|
||||||
|
"value": "5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000011"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tags",
|
||||||
|
"in": "query",
|
||||||
|
"required": false,
|
||||||
|
"style": "form",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "blue"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000007"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sort",
|
||||||
|
"in": "query",
|
||||||
|
"required": false,
|
||||||
|
"style": "form",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "id"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000007"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": [
|
||||||
|
{
|
||||||
|
"count": 1,
|
||||||
|
"description": "Socks fit for a Messiah. You too can experience walking in water with these special edition beauties. Each hole is lovingly proggled to leave smooth edges. The only sock approved by a higher power.",
|
||||||
|
"id": "03fef6ac-1896-4ce8-bd69-b798f85c6e0b",
|
||||||
|
"imageUrl": [
|
||||||
|
"/catalogue/images/holy_1.jpeg",
|
||||||
|
"/catalogue/images/holy_2.jpeg"
|
||||||
|
],
|
||||||
|
"name": "Holy",
|
||||||
|
"price": 99.99,
|
||||||
|
"tag": [
|
||||||
|
"action",
|
||||||
|
"magic"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"count": 438,
|
||||||
|
"description": "proident occaecat irure et excepteur labore minim nisi amet irure",
|
||||||
|
"id": "3395a43e-2d88-40de-b95f-e00e1502085b",
|
||||||
|
"imageUrl": [
|
||||||
|
"/catalogue/images/colourful_socks.jpg",
|
||||||
|
"/catalogue/images/colourful_socks.jpg"
|
||||||
|
],
|
||||||
|
"name": "Colourful",
|
||||||
|
"price": 18,
|
||||||
|
"tag": [
|
||||||
|
"brown",
|
||||||
|
"blue"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"count": 820,
|
||||||
|
"description": "Ready for action. Engineers: be ready to smash that next bug! Be ready, with these super-action-sport-masterpieces. This particular engineer was chased away from the office with a stick.",
|
||||||
|
"id": "510a0d7e-8e83-4193-b483-e27e09ddc34d",
|
||||||
|
"imageUrl": [
|
||||||
|
"/catalogue/images/puma_1.jpeg",
|
||||||
|
"/catalogue/images/puma_2.jpeg"
|
||||||
|
],
|
||||||
|
"name": "SuperSport XL",
|
||||||
|
"price": 15,
|
||||||
|
"tag": [
|
||||||
|
"sport",
|
||||||
|
"formal",
|
||||||
|
"black"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"count": 738,
|
||||||
|
"description": "A mature sock, crossed, with an air of nonchalance.",
|
||||||
|
"id": "808a2de1-1aaa-4c25-a9b9-6612e8f29a38",
|
||||||
|
"imageUrl": [
|
||||||
|
"/catalogue/images/cross_1.jpeg",
|
||||||
|
"/catalogue/images/cross_2.jpeg"
|
||||||
|
],
|
||||||
|
"name": "Crossed",
|
||||||
|
"price": 17.32,
|
||||||
|
"tag": [
|
||||||
|
"blue",
|
||||||
|
"action",
|
||||||
|
"red",
|
||||||
|
"formal"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"count": 808,
|
||||||
|
"description": "enim officia aliqua excepteur esse deserunt quis aliquip nostrud anim",
|
||||||
|
"id": "819e1fbf-8b7e-4f6d-811f-693534916a8b",
|
||||||
|
"imageUrl": [
|
||||||
|
"/catalogue/images/WAT.jpg",
|
||||||
|
"/catalogue/images/WAT2.jpg"
|
||||||
|
],
|
||||||
|
"name": "Figueroa",
|
||||||
|
"price": 14,
|
||||||
|
"tag": [
|
||||||
|
"green",
|
||||||
|
"formal",
|
||||||
|
"blue"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"count": 175,
|
||||||
|
"description": "consequat amet cupidatat minim laborum tempor elit ex consequat in",
|
||||||
|
"id": "837ab141-399e-4c1f-9abc-bace40296bac",
|
||||||
|
"imageUrl": [
|
||||||
|
"/catalogue/images/catsocks.jpg",
|
||||||
|
"/catalogue/images/catsocks2.jpg"
|
||||||
|
],
|
||||||
|
"name": "Cat socks",
|
||||||
|
"price": 15,
|
||||||
|
"tag": [
|
||||||
|
"brown",
|
||||||
|
"formal",
|
||||||
|
"green"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"x-sample-entry": "000000000000000000000011"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000011"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"some-source": {
|
||||||
|
"entries": 3,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298057.7849188,
|
||||||
|
"lastSeen": 1627298065.7258668,
|
||||||
|
"sumRT": 0.024999999999999998,
|
||||||
|
"sumDuration": 7.940948009490967
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 3,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298057.7849188,
|
||||||
|
"lastSeen": 1627298065.7258668,
|
||||||
|
"sumRT": 0.024999999999999998,
|
||||||
|
"sumDuration": 7.940948009490967
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1627298065.7258668,
|
||||||
|
"x-sample-entry": "000000000000000000000011"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/catalogue/size": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"catalogue"
|
||||||
|
],
|
||||||
|
"summary": "/catalogue/size",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.013 seconds",
|
||||||
|
"operationId": "2315e69d-9d66-48cf-b3d3-fec9c30bd28b",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "tags",
|
||||||
|
"in": "query",
|
||||||
|
"required": true,
|
||||||
|
"style": "form",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000001"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "x-some",
|
||||||
|
"in": "header",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "demo val"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000001"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": {
|
||||||
|
"err": null,
|
||||||
|
"size": 9
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000001"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000001"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"some-source": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298057.7841518,
|
||||||
|
"lastSeen": 1627298057.7841518,
|
||||||
|
"sumRT": 0.013,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298057.7841518,
|
||||||
|
"lastSeen": 1627298057.7841518,
|
||||||
|
"sumRT": 0.013,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1627298057.7841518,
|
||||||
|
"x-sample-entry": "000000000000000000000001"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/catalogue/{id}": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"catalogue"
|
||||||
|
],
|
||||||
|
"summary": "/catalogue/{id}",
|
||||||
|
"description": "Mizu observed 4 entries (0 failed), at 1.899 hits/s, average response time is 0.003 seconds",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "non-required-header",
|
||||||
|
"in": "header",
|
||||||
|
"required": false,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"example": "some-uuid-maybe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "x-some",
|
||||||
|
"in": "header",
|
||||||
|
"required": false,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "demoval"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000004"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": {
|
||||||
|
"count": 438,
|
||||||
|
"description": "proident occaecat irure et excepteur labore minim nisi amet irure",
|
||||||
|
"id": "3395a43e-2d88-40de-b95f-e00e1502085b",
|
||||||
|
"imageUrl": [
|
||||||
|
"/catalogue/images/colourful_socks.jpg",
|
||||||
|
"/catalogue/images/colourful_socks.jpg"
|
||||||
|
],
|
||||||
|
"name": "Colourful",
|
||||||
|
"price": 18,
|
||||||
|
"tag": [
|
||||||
|
"brown",
|
||||||
|
"blue"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000012"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000012"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"some-source": {
|
||||||
|
"entries": 4,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298058.1315014,
|
||||||
|
"lastSeen": 1627298065.7293031,
|
||||||
|
"sumRT": 0.013999999999999999,
|
||||||
|
"sumDuration": 7.597801685333252
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 4,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298058.1315014,
|
||||||
|
"lastSeen": 1627298065.7293031,
|
||||||
|
"sumRT": 0.013999999999999999,
|
||||||
|
"sumDuration": 7.597801685333252
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1627298065.7293031,
|
||||||
|
"x-sample-entry": "000000000000000000000012"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "3395a43e-2d88-40de-b95f-e00e1502085b"
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "808a2de1-1aaa-4c25-a9b9-6612e8f29a38"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"example": "some-uuid-maybe",
|
||||||
|
"x-sample-entry": "000000000000000000000012"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"/catalogue/{id}/details": {
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"example": "some-uuid-maybe"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"/tags": {
|
||||||
|
"get": {
|
||||||
|
"summary": "/tags",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.007 seconds",
|
||||||
|
"operationId": "c4d7d0ed-1a78-4370-a049-efe3abc631a6",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": {
|
||||||
|
"err": null,
|
||||||
|
"tags": [
|
||||||
|
"brown",
|
||||||
|
"geek",
|
||||||
|
"formal",
|
||||||
|
"blue",
|
||||||
|
"skin",
|
||||||
|
"red",
|
||||||
|
"action",
|
||||||
|
"sport",
|
||||||
|
"black",
|
||||||
|
"magic",
|
||||||
|
"green"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000003"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000003"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"some-source": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298057.7841816,
|
||||||
|
"lastSeen": 1627298057.7841816,
|
||||||
|
"sumRT": 0.007,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298057.7841816,
|
||||||
|
"lastSeen": 1627298057.7841816,
|
||||||
|
"sumRT": 0.007,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1627298057.7841816,
|
||||||
|
"x-sample-entry": "000000000000000000000003"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"some-source": {
|
||||||
|
"entries": 9,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298057.7841518,
|
||||||
|
"lastSeen": 1627298065.7293031,
|
||||||
|
"sumRT": 0.05899999999999999,
|
||||||
|
"sumDuration": 15.538749694824219
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 9,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1627298057.7841518,
|
||||||
|
"lastSeen": 1627298065.7293031,
|
||||||
|
"sumRT": 0.05899999999999999,
|
||||||
|
"sumDuration": 15.538749694824219
|
||||||
|
}
|
||||||
|
}
|
||||||
897
agent/pkg/oas/oas-samples/httpbin.org.json
Normal file
897
agent/pkg/oas/oas-samples/httpbin.org.json
Normal file
@@ -0,0 +1,897 @@
|
|||||||
|
{
|
||||||
|
"openapi": "3.1.0",
|
||||||
|
"info": {
|
||||||
|
"title": "https://httpbin.org",
|
||||||
|
"description": "Mizu observed 19 entries (0 failed), at 0.106 hits/s, average response time is 0.172 seconds",
|
||||||
|
"version": "1.0"
|
||||||
|
},
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"url": "https://httpbin.org"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"paths": {
|
||||||
|
"/appears-once": {
|
||||||
|
"get": {
|
||||||
|
"summary": "/appears-once",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.630 seconds",
|
||||||
|
"operationId": "2d34623e-fde8-4720-8390-9a7439051755",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": null,
|
||||||
|
"x-sample-entry": "000000000000000000000004"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000004"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750580.0471218,
|
||||||
|
"lastSeen": 1567750580.0471218,
|
||||||
|
"sumRT": 0.63,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750580.0471218,
|
||||||
|
"lastSeen": 1567750580.0471218,
|
||||||
|
"sumRT": 0.63,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750580.0471218,
|
||||||
|
"x-sample-entry": "000000000000000000000004"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/appears-twice": {
|
||||||
|
"get": {
|
||||||
|
"summary": "/appears-twice",
|
||||||
|
"description": "Mizu observed 2 entries (0 failed), at 0.500 hits/s, average response time is 0.630 seconds",
|
||||||
|
"operationId": "9c5330f3-8062-468b-b5a3-df1ad82b4846",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": null,
|
||||||
|
"x-sample-entry": "000000000000000000000006"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000006"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 2,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750580.7471218,
|
||||||
|
"lastSeen": 1567750581.7471218,
|
||||||
|
"sumRT": 1.26,
|
||||||
|
"sumDuration": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 2,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750580.7471218,
|
||||||
|
"lastSeen": 1567750581.7471218,
|
||||||
|
"sumRT": 1.26,
|
||||||
|
"sumDuration": 1
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750581.7471218,
|
||||||
|
"x-sample-entry": "000000000000000000000006"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/body-optional": {
|
||||||
|
"post": {
|
||||||
|
"summary": "/body-optional",
|
||||||
|
"description": "Mizu observed 3 entries (0 failed), at 0.003 hits/s, average response time is 0.001 seconds",
|
||||||
|
"operationId": "34f3d66c-b1f7-4dca-9cab-987fcc8ae472",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"x-sample-entry": "000000000000000000000012"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000012"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 3,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750581.7471218,
|
||||||
|
"lastSeen": 1567750581.757122,
|
||||||
|
"sumRT": 0.003,
|
||||||
|
"sumDuration": 0.010000228881835938
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 3,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750581.7471218,
|
||||||
|
"lastSeen": 1567750581.757122,
|
||||||
|
"sumRT": 0.003,
|
||||||
|
"sumDuration": 0.010000228881835938
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750581.757122,
|
||||||
|
"x-sample-entry": "000000000000000000000012",
|
||||||
|
"requestBody": {
|
||||||
|
"description": "Generic request body",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": "{\"key\", \"val\"}",
|
||||||
|
"x-sample-entry": "000000000000000000000011"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000012"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/body-required": {
|
||||||
|
"post": {
|
||||||
|
"summary": "/body-required",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.001 seconds",
|
||||||
|
"operationId": "ff6add53-ab1c-4d4e-b590-0835fa318276",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"x-sample-entry": "000000000000000000000013"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000013"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750581.757122,
|
||||||
|
"lastSeen": 1567750581.757122,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750581.757122,
|
||||||
|
"lastSeen": 1567750581.757122,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750581.757122,
|
||||||
|
"x-sample-entry": "000000000000000000000013",
|
||||||
|
"requestBody": {
|
||||||
|
"description": "Generic request body",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"example": "body exists",
|
||||||
|
"x-sample-entry": "000000000000000000000013"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"x-sample-entry": "000000000000000000000013"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/form-multipart": {
|
||||||
|
"post": {
|
||||||
|
"summary": "/form-multipart",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.001 seconds",
|
||||||
|
"operationId": "153f0925-9fc7-4e9f-9d33-f1470f25f0f7",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"example": {},
|
||||||
|
"x-sample-entry": "000000000000000000000009"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000009"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.7471218,
|
||||||
|
"lastSeen": 1567750582.7471218,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.7471218,
|
||||||
|
"lastSeen": 1567750582.7471218,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750582.7471218,
|
||||||
|
"x-sample-entry": "000000000000000000000009",
|
||||||
|
"requestBody": {
|
||||||
|
"description": "Generic request body",
|
||||||
|
"content": {
|
||||||
|
"multipart/form-data": {
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"file",
|
||||||
|
"path"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"file": {
|
||||||
|
"type": "string",
|
||||||
|
"contentMediaType": "application/json",
|
||||||
|
"examples": [
|
||||||
|
"{\"functions\": 123}"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"/content/components"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"example": "--BOUNDARY\r\nContent-Disposition: form-data; name=\"file\"; filename=\"metadata.json\"\r\nContent-Type: application/json\r\n\r\n{\"functions\": 123}\r\n--BOUNDARY\r\nContent-Disposition: form-data; name=\"path\"\r\n\r\n/content/components\r\n--BOUNDARY--\r\n",
|
||||||
|
"x-sample-entry": "000000000000000000000009"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"x-sample-entry": "000000000000000000000009"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/form-urlencoded": {
|
||||||
|
"post": {
|
||||||
|
"summary": "/form-urlencoded",
|
||||||
|
"description": "Mizu observed 2 entries (0 failed), at 0.500 hits/s, average response time is 0.001 seconds",
|
||||||
|
"operationId": "c92189f5-5636-46eb-ac71-92b17941a568",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"x-sample-entry": "000000000000000000000008"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000008"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 2,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750580.7471218,
|
||||||
|
"lastSeen": 1567750581.7471218,
|
||||||
|
"sumRT": 0.002,
|
||||||
|
"sumDuration": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 2,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750580.7471218,
|
||||||
|
"lastSeen": 1567750581.7471218,
|
||||||
|
"sumRT": 0.002,
|
||||||
|
"sumDuration": 1
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750581.7471218,
|
||||||
|
"x-sample-entry": "000000000000000000000008",
|
||||||
|
"requestBody": {
|
||||||
|
"description": "Generic request body",
|
||||||
|
"content": {
|
||||||
|
"application/x-www-form-urlencoded": {
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"agent-id",
|
||||||
|
"callback-url",
|
||||||
|
"token"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"agent-id": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"ade"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"callback-url": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
""
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"optional": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"another"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"token": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"sometoken",
|
||||||
|
"sometoken-second-val"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"example": "agent-id=ade\u0026callback-url=\u0026token=sometoken",
|
||||||
|
"x-sample-entry": "000000000000000000000008"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"x-sample-entry": "000000000000000000000008"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/param-patterns/prefix-gibberish-fine/{prefixgibberishfineId}": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"param-patterns"
|
||||||
|
],
|
||||||
|
"summary": "/param-patterns/prefix-gibberish-fine/{prefixgibberishfineId}",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.001 seconds",
|
||||||
|
"operationId": "85270437-7aae-4a5b-b988-3662092463d0",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"x-sample-entry": "000000000000000000000014"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000014"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582,
|
||||||
|
"lastSeen": 1567750582,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582,
|
||||||
|
"lastSeen": 1567750582,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750582,
|
||||||
|
"x-sample-entry": "000000000000000000000014"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "prefixgibberishfineId",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "234324"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000014"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"/param-patterns/{parampatternId}": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"param-patterns"
|
||||||
|
],
|
||||||
|
"summary": "/param-patterns/{parampatternId}",
|
||||||
|
"description": "Mizu observed 2 entries (0 failed), at 0.000 hits/s, average response time is 0.001 seconds",
|
||||||
|
"operationId": "da597734-1cf5-4d3b-917b-6b02dacf7b7b",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"x-sample-entry": "000000000000000000000018"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000018"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 2,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.000003,
|
||||||
|
"lastSeen": 1567750582.000004,
|
||||||
|
"sumRT": 0.002,
|
||||||
|
"sumDuration": 9.5367431640625e-7
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 2,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.000003,
|
||||||
|
"lastSeen": 1567750582.000004,
|
||||||
|
"sumRT": 0.002,
|
||||||
|
"sumDuration": 9.5367431640625e-7
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750582.000004,
|
||||||
|
"x-sample-entry": "000000000000000000000018"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "parampatternId",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^prefix-gibberish-.+"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "prefix-gibberish-sfdlasdfkadf87sd93284q24r"
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "prefix-gibberish-adslkfasdf89sa7dfasddafa8a98sd7kansdf"
|
||||||
|
},
|
||||||
|
"example #2": {
|
||||||
|
"value": "prefix-gibberish-4jk5l2345h2452l4352435jlk45"
|
||||||
|
},
|
||||||
|
"example #3": {
|
||||||
|
"value": "prefix-gibberish-84395h2j4k35hj243j5h2kl34h54k"
|
||||||
|
},
|
||||||
|
"example #4": {
|
||||||
|
"value": "prefix-gibberish-afterwards"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000019"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"/param-patterns/{parampatternId}/1": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"param-patterns"
|
||||||
|
],
|
||||||
|
"summary": "/param-patterns/{parampatternId}/1",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.001 seconds",
|
||||||
|
"operationId": "e965a245-9cfc-48ed-94e1-f765eadb3960",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"x-sample-entry": "000000000000000000000015"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000015"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.000001,
|
||||||
|
"lastSeen": 1567750582.000001,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.000001,
|
||||||
|
"lastSeen": 1567750582.000001,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750582.000001,
|
||||||
|
"x-sample-entry": "000000000000000000000015"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "parampatternId",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^prefix-gibberish-.+"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "prefix-gibberish-sfdlasdfkadf87sd93284q24r"
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "prefix-gibberish-adslkfasdf89sa7dfasddafa8a98sd7kansdf"
|
||||||
|
},
|
||||||
|
"example #2": {
|
||||||
|
"value": "prefix-gibberish-4jk5l2345h2452l4352435jlk45"
|
||||||
|
},
|
||||||
|
"example #3": {
|
||||||
|
"value": "prefix-gibberish-84395h2j4k35hj243j5h2kl34h54k"
|
||||||
|
},
|
||||||
|
"example #4": {
|
||||||
|
"value": "prefix-gibberish-afterwards"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000019"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"/param-patterns/{parampatternId}/static": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"param-patterns"
|
||||||
|
],
|
||||||
|
"summary": "/param-patterns/{parampatternId}/static",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.001 seconds",
|
||||||
|
"operationId": "7af420dc-f8b7-450f-8f6f-18b039aa3cde",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"x-sample-entry": "000000000000000000000016"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000016"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.000002,
|
||||||
|
"lastSeen": 1567750582.000002,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.000002,
|
||||||
|
"lastSeen": 1567750582.000002,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750582.000002,
|
||||||
|
"x-sample-entry": "000000000000000000000016"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "parampatternId",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^prefix-gibberish-.+"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "prefix-gibberish-sfdlasdfkadf87sd93284q24r"
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "prefix-gibberish-adslkfasdf89sa7dfasddafa8a98sd7kansdf"
|
||||||
|
},
|
||||||
|
"example #2": {
|
||||||
|
"value": "prefix-gibberish-4jk5l2345h2452l4352435jlk45"
|
||||||
|
},
|
||||||
|
"example #3": {
|
||||||
|
"value": "prefix-gibberish-84395h2j4k35hj243j5h2kl34h54k"
|
||||||
|
},
|
||||||
|
"example #4": {
|
||||||
|
"value": "prefix-gibberish-afterwards"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000019"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"/param-patterns/{parampatternId}/{param1}": {
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"param-patterns"
|
||||||
|
],
|
||||||
|
"summary": "/param-patterns/{parampatternId}/{param1}",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.001 seconds",
|
||||||
|
"operationId": "02a1771d-2d50-4a8c-8be2-29c7e59b8435",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"": {
|
||||||
|
"x-sample-entry": "000000000000000000000019"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000019"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.000002,
|
||||||
|
"lastSeen": 1567750582.000002,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750582.000002,
|
||||||
|
"lastSeen": 1567750582.000002,
|
||||||
|
"sumRT": 0.001,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750582.000002,
|
||||||
|
"x-sample-entry": "000000000000000000000019"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "param1",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "23421"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000019"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "parampatternId",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^prefix-gibberish-.+"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "prefix-gibberish-sfdlasdfkadf87sd93284q24r"
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "prefix-gibberish-adslkfasdf89sa7dfasddafa8a98sd7kansdf"
|
||||||
|
},
|
||||||
|
"example #2": {
|
||||||
|
"value": "prefix-gibberish-4jk5l2345h2452l4352435jlk45"
|
||||||
|
},
|
||||||
|
"example #3": {
|
||||||
|
"value": "prefix-gibberish-84395h2j4k35hj243j5h2kl34h54k"
|
||||||
|
},
|
||||||
|
"example #4": {
|
||||||
|
"value": "prefix-gibberish-afterwards"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000019"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"/{Id}": {
|
||||||
|
"get": {
|
||||||
|
"summary": "/{Id}",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.630 seconds",
|
||||||
|
"operationId": "77ec4910-d47a-46a5-8234-fb80a11034b4",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": null,
|
||||||
|
"x-sample-entry": "000000000000000000000003"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000003"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750579.7471218,
|
||||||
|
"lastSeen": 1567750579.7471218,
|
||||||
|
"sumRT": 0.63,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750579.7471218,
|
||||||
|
"lastSeen": 1567750579.7471218,
|
||||||
|
"sumRT": 0.63,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750579.7471218,
|
||||||
|
"x-sample-entry": "000000000000000000000003"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "Id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "e21f7112-3d3b-4632-9da3-a4af2e0e9166"
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "952bea17-3776-11ea-9341-42010a84012a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000003"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"/{Id}/sub1": {
|
||||||
|
"get": {
|
||||||
|
"summary": "/{Id}/sub1",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.111 seconds",
|
||||||
|
"operationId": "198675eb-9faf-407b-83fa-0483a730bbbe",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"text/html": {
|
||||||
|
"x-sample-entry": "000000000000000000000001"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000001"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750483.864529,
|
||||||
|
"lastSeen": 1567750483.864529,
|
||||||
|
"sumRT": 0.111,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750483.864529,
|
||||||
|
"lastSeen": 1567750483.864529,
|
||||||
|
"sumRT": 0.111,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750483.864529,
|
||||||
|
"x-sample-entry": "000000000000000000000001"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "Id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "e21f7112-3d3b-4632-9da3-a4af2e0e9166"
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "952bea17-3776-11ea-9341-42010a84012a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000003"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"/{Id}/sub2": {
|
||||||
|
"get": {
|
||||||
|
"summary": "/{Id}/sub2",
|
||||||
|
"description": "Mizu observed 1 entries (0 failed), at 0.000 hits/s, average response time is 0.630 seconds",
|
||||||
|
"operationId": "31d880f1-152f-4dd6-84a7-463e13b694a5",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Successful call with status 200",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"example": null,
|
||||||
|
"x-sample-entry": "000000000000000000000002"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000002"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750578.7471218,
|
||||||
|
"lastSeen": 1567750578.7471218,
|
||||||
|
"sumRT": 0.63,
|
||||||
|
"sumDuration": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 1,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750578.7471218,
|
||||||
|
"lastSeen": 1567750578.7471218,
|
||||||
|
"sumRT": 0.63,
|
||||||
|
"sumDuration": 0
|
||||||
|
},
|
||||||
|
"x-last-seen-ts": 1567750578.7471218,
|
||||||
|
"x-sample-entry": "000000000000000000000002"
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "Id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true,
|
||||||
|
"style": "simple",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"examples": {
|
||||||
|
"example #0": {
|
||||||
|
"value": "e21f7112-3d3b-4632-9da3-a4af2e0e9166"
|
||||||
|
},
|
||||||
|
"example #1": {
|
||||||
|
"value": "952bea17-3776-11ea-9341-42010a84012a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-sample-entry": "000000000000000000000003"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-per-source": {
|
||||||
|
"": {
|
||||||
|
"entries": 19,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750483.864529,
|
||||||
|
"lastSeen": 1567750582.7471218,
|
||||||
|
"sumRT": 3.273999999999999,
|
||||||
|
"sumDuration": 2.0100011825561523
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-counters-total": {
|
||||||
|
"entries": 19,
|
||||||
|
"failures": 0,
|
||||||
|
"firstSeen": 1567750483.864529,
|
||||||
|
"lastSeen": 1567750582.7471218,
|
||||||
|
"sumRT": 3.273999999999999,
|
||||||
|
"sumDuration": 2.0100011825561523
|
||||||
|
}
|
||||||
|
}
|
||||||
1787
agent/pkg/oas/oas-samples/trcc-api-service.json
Normal file
1787
agent/pkg/oas/oas-samples/trcc-api-service.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3,12 +3,13 @@ package oas
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"net/url"
|
||||||
|
"sync"
|
||||||
|
|
||||||
basenine "github.com/up9inc/basenine/client/go"
|
basenine "github.com/up9inc/basenine/client/go"
|
||||||
"github.com/up9inc/mizu/agent/pkg/har"
|
"github.com/up9inc/mizu/agent/pkg/har"
|
||||||
"github.com/up9inc/mizu/shared"
|
"github.com/up9inc/mizu/shared"
|
||||||
"github.com/up9inc/mizu/tap/api"
|
"github.com/up9inc/mizu/tap/api"
|
||||||
"net/url"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/up9inc/mizu/shared/logger"
|
"github.com/up9inc/mizu/shared/logger"
|
||||||
)
|
)
|
||||||
@@ -27,11 +28,12 @@ type OasGenerator interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type defaultOasGenerator struct {
|
type defaultOasGenerator struct {
|
||||||
started bool
|
started bool
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
cancel context.CancelFunc
|
cancel context.CancelFunc
|
||||||
serviceSpecs *sync.Map
|
serviceSpecs *sync.Map
|
||||||
dbConn *basenine.Connection
|
dbConn *basenine.Connection
|
||||||
|
dbMutex sync.Mutex
|
||||||
entriesQuery string
|
entriesQuery string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,16 +79,17 @@ func (g *defaultOasGenerator) Stop() {
|
|||||||
if !g.started {
|
if !g.started {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
g.started = false
|
||||||
if g.dbConn != nil {
|
|
||||||
g.dbConn.Close()
|
|
||||||
g.dbConn = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
g.cancel()
|
g.cancel()
|
||||||
g.reset()
|
g.reset()
|
||||||
|
|
||||||
g.started = false
|
g.dbMutex.Lock()
|
||||||
|
defer g.dbMutex.Unlock()
|
||||||
|
if g.dbConn != nil {
|
||||||
|
g.dbConn.Close()
|
||||||
|
g.dbConn = nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *defaultOasGenerator) IsStarted() bool {
|
func (g *defaultOasGenerator) IsStarted() bool {
|
||||||
@@ -98,8 +101,12 @@ func (g *defaultOasGenerator) runGenerator() {
|
|||||||
dataChan := make(chan []byte)
|
dataChan := make(chan []byte)
|
||||||
metaChan := make(chan []byte)
|
metaChan := make(chan []byte)
|
||||||
|
|
||||||
|
g.dbMutex.Lock()
|
||||||
|
defer g.dbMutex.Unlock()
|
||||||
logger.Log.Infof("Querying DB for OAS generator with query '%s'", g.entriesQuery)
|
logger.Log.Infof("Querying DB for OAS generator with query '%s'", g.entriesQuery)
|
||||||
g.dbConn.Query(g.entriesQuery, dataChan, metaChan)
|
if err := g.dbConn.Query(g.entriesQuery, dataChan, metaChan); err != nil {
|
||||||
|
logger.Log.Errorf("Query mode call failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
@@ -174,7 +181,7 @@ func (g *defaultOasGenerator) handleHARWithSource(entryWSource *EntryWithSource)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Log.Debugf("Handled entry %d as opId: %s", entryWSource.Id, opId) // TODO: set opId back to entry?
|
logger.Log.Debugf("Handled entry %s as opId: %s", entryWSource.Id, opId) // TODO: set opId back to entry?
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *defaultOasGenerator) getGen(dest string, urlStr string) *SpecGen {
|
func (g *defaultOasGenerator) getGen(dest string, urlStr string) *SpecGen {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/up9inc/mizu/agent/pkg/har"
|
"github.com/up9inc/mizu/agent/pkg/har"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestOASGen(t *testing.T) {
|
func TestOASGen(t *testing.T) {
|
||||||
@@ -38,5 +39,8 @@ func TestOASGen(t *testing.T) {
|
|||||||
if !gen.IsStarted() {
|
if !gen.IsStarted() {
|
||||||
t.Errorf("Should be started")
|
t.Errorf("Should be started")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
|
||||||
gen.Stop()
|
gen.Stop()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,6 @@ package oas
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/chanced/openapi"
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/nav-inc/datetime"
|
|
||||||
"github.com/up9inc/mizu/shared/logger"
|
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"mime"
|
"mime"
|
||||||
@@ -18,6 +14,11 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/chanced/openapi"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/nav-inc/datetime"
|
||||||
|
"github.com/up9inc/mizu/shared/logger"
|
||||||
|
|
||||||
"github.com/up9inc/mizu/agent/pkg/har"
|
"github.com/up9inc/mizu/agent/pkg/har"
|
||||||
|
|
||||||
"time"
|
"time"
|
||||||
@@ -32,7 +33,7 @@ type EntryWithSource struct {
|
|||||||
Source string
|
Source string
|
||||||
Destination string
|
Destination string
|
||||||
Entry har.Entry
|
Entry har.Entry
|
||||||
Id uint
|
Id string
|
||||||
}
|
}
|
||||||
|
|
||||||
type reqResp struct { // hello, generics in Go
|
type reqResp struct { // hello, generics in Go
|
||||||
@@ -67,7 +68,7 @@ func (g *SpecGen) StartFromSpec(oas *openapi.OpenAPI) {
|
|||||||
g.tree = new(Node)
|
g.tree = new(Node)
|
||||||
for pathStr, pathObj := range oas.Paths.Items {
|
for pathStr, pathObj := range oas.Paths.Items {
|
||||||
pathSplit := strings.Split(string(pathStr), "/")
|
pathSplit := strings.Split(string(pathStr), "/")
|
||||||
g.tree.getOrSet(pathSplit, pathObj, 0)
|
g.tree.getOrSet(pathSplit, pathObj, "")
|
||||||
|
|
||||||
// clean "last entry timestamp" markers from the past
|
// clean "last entry timestamp" markers from the past
|
||||||
for _, pathAndOp := range g.tree.listOps() {
|
for _, pathAndOp := range g.tree.listOps() {
|
||||||
@@ -341,7 +342,7 @@ func handleCounters(opObj *openapi.Operation, success bool, entryWithSource *Ent
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleRequest(req *har.Request, opObj *openapi.Operation, isSuccess bool, sampleId uint) error {
|
func handleRequest(req *har.Request, opObj *openapi.Operation, isSuccess bool, sampleId string) error {
|
||||||
// TODO: we don't handle the situation when header/qstr param can be defined on pathObj level. Also the path param defined on opObj
|
// TODO: we don't handle the situation when header/qstr param can be defined on pathObj level. Also the path param defined on opObj
|
||||||
urlParsed, err := url.Parse(req.URL)
|
urlParsed, err := url.Parse(req.URL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -401,7 +402,7 @@ func handleRequest(req *har.Request, opObj *openapi.Operation, isSuccess bool, s
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleResponse(resp *har.Response, opObj *openapi.Operation, isSuccess bool, sampleId uint) error {
|
func handleResponse(resp *har.Response, opObj *openapi.Operation, isSuccess bool, sampleId string) error {
|
||||||
// TODO: we don't support "default" response
|
// TODO: we don't support "default" response
|
||||||
respObj, err := getResponseObj(resp, opObj, isSuccess)
|
respObj, err := getResponseObj(resp, opObj, isSuccess)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -422,7 +423,7 @@ func handleResponse(resp *har.Response, opObj *openapi.Operation, isSuccess bool
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleRespHeaders(reqHeaders []har.Header, respObj *openapi.ResponseObj, sampleId uint) {
|
func handleRespHeaders(reqHeaders []har.Header, respObj *openapi.ResponseObj, sampleId string) {
|
||||||
visited := map[string]*openapi.HeaderObj{}
|
visited := map[string]*openapi.HeaderObj{}
|
||||||
for _, pair := range reqHeaders {
|
for _, pair := range reqHeaders {
|
||||||
if isHeaderIgnored(pair.Name) {
|
if isHeaderIgnored(pair.Name) {
|
||||||
@@ -466,7 +467,7 @@ func handleRespHeaders(reqHeaders []har.Header, respObj *openapi.ResponseObj, sa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func fillContent(reqResp reqResp, respContent openapi.Content, ctype string, sampleId uint) (*openapi.MediaType, error) {
|
func fillContent(reqResp reqResp, respContent openapi.Content, ctype string, sampleId string) (*openapi.MediaType, error) {
|
||||||
content, found := respContent[ctype]
|
content, found := respContent[ctype]
|
||||||
if !found {
|
if !found {
|
||||||
respContent[ctype] = &openapi.MediaType{}
|
respContent[ctype] = &openapi.MediaType{}
|
||||||
|
|||||||
@@ -22,10 +22,10 @@
|
|||||||
"content": {
|
"content": {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
"example": null,
|
"example": null,
|
||||||
"x-sample-entry": 4
|
"x-sample-entry": "000000000000000000000004"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 4
|
"x-sample-entry": "000000000000000000000004"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750580.04,
|
"x-last-seen-ts": 1567750580.04,
|
||||||
"x-sample-entry": 4
|
"x-sample-entry": "000000000000000000000004"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/appears-twice": {
|
"/appears-twice": {
|
||||||
@@ -61,10 +61,10 @@
|
|||||||
"content": {
|
"content": {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
"example": null,
|
"example": null,
|
||||||
"x-sample-entry": 6
|
"x-sample-entry": "000000000000000000000006"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 6
|
"x-sample-entry": "000000000000000000000006"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
"sumDuration": 1
|
"sumDuration": 1
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750581.74,
|
"x-last-seen-ts": 1567750581.74,
|
||||||
"x-sample-entry": 6
|
"x-sample-entry": "000000000000000000000006"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/body-optional": {
|
"/body-optional": {
|
||||||
@@ -99,10 +99,10 @@
|
|||||||
"description": "Successful call with status 200",
|
"description": "Successful call with status 200",
|
||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"x-sample-entry": 12
|
"x-sample-entry": "000000000000000000000012"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 12
|
"x-sample-entry": "000000000000000000000012"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -124,16 +124,16 @@
|
|||||||
"sumDuration": 0.01
|
"sumDuration": 0.01
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750581.75,
|
"x-last-seen-ts": 1567750581.75,
|
||||||
"x-sample-entry": 12,
|
"x-sample-entry": "000000000000000000000012",
|
||||||
"requestBody": {
|
"requestBody": {
|
||||||
"description": "Generic request body",
|
"description": "Generic request body",
|
||||||
"content": {
|
"content": {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
"example": "{\"key\", \"val\"}",
|
"example": "{\"key\", \"val\"}",
|
||||||
"x-sample-entry": 11
|
"x-sample-entry": "000000000000000000000011"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 12
|
"x-sample-entry": "000000000000000000000012"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -147,10 +147,10 @@
|
|||||||
"description": "Successful call with status 200",
|
"description": "Successful call with status 200",
|
||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"x-sample-entry": 13
|
"x-sample-entry": "000000000000000000000013"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 13
|
"x-sample-entry": "000000000000000000000013"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -172,17 +172,17 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750581.75,
|
"x-last-seen-ts": 1567750581.75,
|
||||||
"x-sample-entry": 13,
|
"x-sample-entry": "000000000000000000000013",
|
||||||
"requestBody": {
|
"requestBody": {
|
||||||
"description": "Generic request body",
|
"description": "Generic request body",
|
||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"example": "body exists",
|
"example": "body exists",
|
||||||
"x-sample-entry": 13
|
"x-sample-entry": "000000000000000000000013"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": true,
|
"required": true,
|
||||||
"x-sample-entry": 13
|
"x-sample-entry": "000000000000000000000013"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -197,10 +197,10 @@
|
|||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"example": {},
|
"example": {},
|
||||||
"x-sample-entry": 9
|
"x-sample-entry": "000000000000000000000009"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 9
|
"x-sample-entry": "000000000000000000000009"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -222,7 +222,7 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750582.74,
|
"x-last-seen-ts": 1567750582.74,
|
||||||
"x-sample-entry": 9,
|
"x-sample-entry": "000000000000000000000009",
|
||||||
"requestBody": {
|
"requestBody": {
|
||||||
"description": "Generic request body",
|
"description": "Generic request body",
|
||||||
"content": {
|
"content": {
|
||||||
@@ -250,11 +250,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"example": "--BOUNDARY\r\nContent-Disposition: form-data; name=\"file\"; filename=\"metadata.json\"\r\nContent-Type: application/json\r\n\r\n{\"functions\": 123}\r\n--BOUNDARY\r\nContent-Disposition: form-data; name=\"path\"\r\n\r\n/content/components\r\n--BOUNDARY--\r\n",
|
"example": "--BOUNDARY\r\nContent-Disposition: form-data; name=\"file\"; filename=\"metadata.json\"\r\nContent-Type: application/json\r\n\r\n{\"functions\": 123}\r\n--BOUNDARY\r\nContent-Disposition: form-data; name=\"path\"\r\n\r\n/content/components\r\n--BOUNDARY--\r\n",
|
||||||
"x-sample-entry": 9
|
"x-sample-entry": "000000000000000000000009"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": true,
|
"required": true,
|
||||||
"x-sample-entry": 9
|
"x-sample-entry": "000000000000000000000009"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -268,10 +268,10 @@
|
|||||||
"description": "Successful call with status 200",
|
"description": "Successful call with status 200",
|
||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"x-sample-entry": 8
|
"x-sample-entry": "000000000000000000000008"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 8
|
"x-sample-entry": "000000000000000000000008"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -293,7 +293,7 @@
|
|||||||
"sumDuration": 1
|
"sumDuration": 1
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750581.74,
|
"x-last-seen-ts": 1567750581.74,
|
||||||
"x-sample-entry": 8,
|
"x-sample-entry": "000000000000000000000008",
|
||||||
"requestBody": {
|
"requestBody": {
|
||||||
"description": "Generic request body",
|
"description": "Generic request body",
|
||||||
"content": {
|
"content": {
|
||||||
@@ -334,11 +334,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"example": "agent-id=ade\u0026callback-url=\u0026token=sometoken",
|
"example": "agent-id=ade\u0026callback-url=\u0026token=sometoken",
|
||||||
"x-sample-entry": 8
|
"x-sample-entry": "000000000000000000000008"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": true,
|
"required": true,
|
||||||
"x-sample-entry": 8
|
"x-sample-entry": "000000000000000000000008"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -355,10 +355,10 @@
|
|||||||
"description": "Successful call with status 200",
|
"description": "Successful call with status 200",
|
||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"x-sample-entry": 14
|
"x-sample-entry": "000000000000000000000014"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 14
|
"x-sample-entry": "000000000000000000000014"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -380,7 +380,7 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750582,
|
"x-last-seen-ts": 1567750582,
|
||||||
"x-sample-entry": 14
|
"x-sample-entry": "000000000000000000000014"
|
||||||
},
|
},
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
@@ -396,7 +396,7 @@
|
|||||||
"value": "234324"
|
"value": "234324"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 14
|
"x-sample-entry": "000000000000000000000014"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -413,10 +413,10 @@
|
|||||||
"description": "Successful call with status 200",
|
"description": "Successful call with status 200",
|
||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"x-sample-entry": 18
|
"x-sample-entry": "000000000000000000000018"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 18
|
"x-sample-entry": "000000000000000000000018"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -438,7 +438,7 @@
|
|||||||
"sumDuration": 9.53e-7
|
"sumDuration": 9.53e-7
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750582.00,
|
"x-last-seen-ts": 1567750582.00,
|
||||||
"x-sample-entry": 18
|
"x-sample-entry": "000000000000000000000018"
|
||||||
},
|
},
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
@@ -467,7 +467,7 @@
|
|||||||
"value": "prefix-gibberish-afterwards"
|
"value": "prefix-gibberish-afterwards"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 19
|
"x-sample-entry": "000000000000000000000019"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -484,10 +484,10 @@
|
|||||||
"description": "Successful call with status 200",
|
"description": "Successful call with status 200",
|
||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"x-sample-entry": 15
|
"x-sample-entry": "000000000000000000000015"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 15
|
"x-sample-entry": "000000000000000000000015"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -509,7 +509,7 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750582.00,
|
"x-last-seen-ts": 1567750582.00,
|
||||||
"x-sample-entry": 15
|
"x-sample-entry": "000000000000000000000015"
|
||||||
},
|
},
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
@@ -538,7 +538,7 @@
|
|||||||
"value": "prefix-gibberish-afterwards"
|
"value": "prefix-gibberish-afterwards"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 19
|
"x-sample-entry": "000000000000000000000019"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -555,10 +555,10 @@
|
|||||||
"description": "Successful call with status 200",
|
"description": "Successful call with status 200",
|
||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"x-sample-entry": 16
|
"x-sample-entry": "000000000000000000000016"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 16
|
"x-sample-entry": "000000000000000000000016"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -580,7 +580,7 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750582.00,
|
"x-last-seen-ts": 1567750582.00,
|
||||||
"x-sample-entry": 16
|
"x-sample-entry": "000000000000000000000016"
|
||||||
},
|
},
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
@@ -609,7 +609,7 @@
|
|||||||
"value": "prefix-gibberish-afterwards"
|
"value": "prefix-gibberish-afterwards"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 19
|
"x-sample-entry": "000000000000000000000019"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -626,10 +626,10 @@
|
|||||||
"description": "Successful call with status 200",
|
"description": "Successful call with status 200",
|
||||||
"content": {
|
"content": {
|
||||||
"": {
|
"": {
|
||||||
"x-sample-entry": 19
|
"x-sample-entry": "000000000000000000000019"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 19
|
"x-sample-entry": "000000000000000000000019"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -651,7 +651,7 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750582.00,
|
"x-last-seen-ts": 1567750582.00,
|
||||||
"x-sample-entry": 19
|
"x-sample-entry": "000000000000000000000019"
|
||||||
},
|
},
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
@@ -667,7 +667,7 @@
|
|||||||
"value": "23421"
|
"value": "23421"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 19
|
"x-sample-entry": "000000000000000000000019"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "parampatternId",
|
"name": "parampatternId",
|
||||||
@@ -695,7 +695,7 @@
|
|||||||
"value": "prefix-gibberish-afterwards"
|
"value": "prefix-gibberish-afterwards"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 19
|
"x-sample-entry": "000000000000000000000019"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -710,10 +710,10 @@
|
|||||||
"content": {
|
"content": {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
"example": null,
|
"example": null,
|
||||||
"x-sample-entry": 3
|
"x-sample-entry": "000000000000000000000003"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 3
|
"x-sample-entry": "000000000000000000000003"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -735,7 +735,7 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750579.74,
|
"x-last-seen-ts": 1567750579.74,
|
||||||
"x-sample-entry": 3
|
"x-sample-entry": "000000000000000000000003"
|
||||||
},
|
},
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
@@ -754,7 +754,7 @@
|
|||||||
"value": "<UUID4>"
|
"value": "<UUID4>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 3
|
"x-sample-entry": "000000000000000000000003"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -768,10 +768,10 @@
|
|||||||
"description": "Successful call with status 200",
|
"description": "Successful call with status 200",
|
||||||
"content": {
|
"content": {
|
||||||
"text/html": {
|
"text/html": {
|
||||||
"x-sample-entry": 1
|
"x-sample-entry": "000000000000000000000001"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 1
|
"x-sample-entry": "000000000000000000000001"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -793,7 +793,7 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750483.86,
|
"x-last-seen-ts": 1567750483.86,
|
||||||
"x-sample-entry": 1
|
"x-sample-entry": "000000000000000000000001"
|
||||||
},
|
},
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
@@ -812,7 +812,7 @@
|
|||||||
"value": "<UUID4>"
|
"value": "<UUID4>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 3
|
"x-sample-entry": "000000000000000000000003"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -827,10 +827,10 @@
|
|||||||
"content": {
|
"content": {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
"example": null,
|
"example": null,
|
||||||
"x-sample-entry": 2
|
"x-sample-entry": "000000000000000000000002"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 2
|
"x-sample-entry": "000000000000000000000002"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-counters-per-source": {
|
"x-counters-per-source": {
|
||||||
@@ -852,7 +852,7 @@
|
|||||||
"sumDuration": 0
|
"sumDuration": 0
|
||||||
},
|
},
|
||||||
"x-last-seen-ts": 1567750578.74,
|
"x-last-seen-ts": 1567750578.74,
|
||||||
"x-sample-entry": 2
|
"x-sample-entry": "000000000000000000000002"
|
||||||
},
|
},
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
@@ -871,7 +871,7 @@
|
|||||||
"value": "<UUID4>"
|
"value": "<UUID4>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-sample-entry": 3
|
"x-sample-entry": "000000000000000000000003"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ package oas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/chanced/openapi"
|
|
||||||
"github.com/up9inc/mizu/shared/logger"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/chanced/openapi"
|
||||||
|
"github.com/up9inc/mizu/shared/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
type NodePath = []string
|
type NodePath = []string
|
||||||
@@ -20,7 +21,7 @@ type Node struct {
|
|||||||
children []*Node
|
children []*Node
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *Node) getOrSet(path NodePath, existingPathObj *openapi.PathObj, sampleId uint) (node *Node) {
|
func (n *Node) getOrSet(path NodePath, existingPathObj *openapi.PathObj, sampleId string) (node *Node) {
|
||||||
if existingPathObj == nil {
|
if existingPathObj == nil {
|
||||||
panic("Invalid function call")
|
panic("Invalid function call")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package oas
|
package oas
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@@ -23,7 +24,7 @@ func TestTree(t *testing.T) {
|
|||||||
for i, tc := range testCases {
|
for i, tc := range testCases {
|
||||||
split := strings.Split(tc.inp, "/")
|
split := strings.Split(tc.inp, "/")
|
||||||
pathObj := new(openapi.PathObj)
|
pathObj := new(openapi.PathObj)
|
||||||
node := tree.getOrSet(split, pathObj, uint(i))
|
node := tree.getOrSet(split, pathObj, fmt.Sprintf("%024d", i))
|
||||||
|
|
||||||
fillPathParams(node, pathObj)
|
fillPathParams(node, pathObj)
|
||||||
|
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ type nvParams struct {
|
|||||||
GeneralizeName func(name string) string
|
GeneralizeName func(name string) string
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleNameVals(gw nvParams, params **openapi.ParameterList, checkIgnore bool, sampleId uint) {
|
func handleNameVals(gw nvParams, params **openapi.ParameterList, checkIgnore bool, sampleId string) {
|
||||||
visited := map[string]*openapi.ParameterObj{}
|
visited := map[string]*openapi.ParameterObj{}
|
||||||
for _, pair := range gw.Pairs {
|
for _, pair := range gw.Pairs {
|
||||||
if (checkIgnore && gw.IsIgnored(pair.Name)) || pair.Name == "" {
|
if (checkIgnore && gw.IsIgnored(pair.Name)) || pair.Name == "" {
|
||||||
@@ -477,8 +477,8 @@ func intersectSliceWithMap(required []string, names map[string]struct{}) []strin
|
|||||||
return required
|
return required
|
||||||
}
|
}
|
||||||
|
|
||||||
func setSampleID(extensions *openapi.Extensions, id uint) {
|
func setSampleID(extensions *openapi.Extensions, id string) {
|
||||||
if id > 0 {
|
if id != "" {
|
||||||
if *extensions == nil {
|
if *extensions == nil {
|
||||||
*extensions = openapi.Extensions{}
|
*extensions = openapi.Extensions{}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ func TestAnyJSON(t *testing.T) {
|
|||||||
} else if tc.inp == "null" && any != nil {
|
} else if tc.inp == "null" && any != nil {
|
||||||
t.Errorf("null has to parse as nil (but got %s)", any)
|
t.Errorf("null has to parse as nil (but got %s)", any)
|
||||||
} else {
|
} else {
|
||||||
t.Logf("%s => %s", tc.inp, any)
|
t.Logf("%s => %v", tc.inp, any)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -323,7 +323,9 @@ func syncEntriesImpl(token string, model string, envPrefix string, uploadInterva
|
|||||||
go handleMetaChannel(&wg, connection, meta)
|
go handleMetaChannel(&wg, connection, meta)
|
||||||
wg.Add(2)
|
wg.Add(2)
|
||||||
|
|
||||||
connection.Query(query, data, meta)
|
if err = connection.Query(query, data, meta); err != nil {
|
||||||
|
logger.Log.Panicf("Query mode call failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ require (
|
|||||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
|
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
|
||||||
github.com/spf13/cobra v1.3.0
|
github.com/spf13/cobra v1.3.0
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/spf13/pflag v1.0.5
|
||||||
github.com/up9inc/basenine/server/lib v0.0.0-20220326121918-785f3061c8ce
|
github.com/up9inc/basenine/server/lib v0.0.0-20220413173135-69508ca741d7
|
||||||
github.com/up9inc/mizu/shared v0.0.0
|
github.com/up9inc/mizu/shared v0.0.0
|
||||||
github.com/up9inc/mizu/tap/api v0.0.0
|
github.com/up9inc/mizu/tap/api v0.0.0
|
||||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8
|
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8
|
||||||
@@ -72,7 +72,7 @@ require (
|
|||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
|
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
|
||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
|
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
|
||||||
github.com/ohler55/ojg v1.12.13 // indirect
|
github.com/ohler55/ojg v1.14.0 // indirect
|
||||||
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
|||||||
@@ -487,8 +487,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb
|
|||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
github.com/ohler55/ojg v1.12.13 h1:FvfVpYzLgMraLcg3rrXiRXaihOP6fnzQNEU9YyZ/AmM=
|
github.com/ohler55/ojg v1.14.0 h1:DyHomsCwofNswmKj7BLMdx51xnKbXxgIo1rVWCaBcNk=
|
||||||
github.com/ohler55/ojg v1.12.13/go.mod h1:LBbIVRAgoFbYBXQhRhuEpaJIqq+goSO63/FQ+nyJU88=
|
github.com/ohler55/ojg v1.14.0/go.mod h1:3+GH+0PggMKocQtbZCrFifal3yRpHiBT4QUkxFJI6e8=
|
||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||||
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
|
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
|
||||||
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
@@ -600,8 +600,8 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69
|
|||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||||
github.com/up9inc/basenine/server/lib v0.0.0-20220326121918-785f3061c8ce h1:PypqybjmuxftGkX4NmP4JAUyEykZj2r6W4r9lnRZ/kE=
|
github.com/up9inc/basenine/server/lib v0.0.0-20220413173135-69508ca741d7 h1:3Mi+0tQFVHXYcrFhwH/h6/2b0tayLcYeFPXyzDV3rvc=
|
||||||
github.com/up9inc/basenine/server/lib v0.0.0-20220326121918-785f3061c8ce/go.mod h1:ZIkxWiJm65jYQIso9k+OZKhR7gQ1we2jNyE2kQX9IQI=
|
github.com/up9inc/basenine/server/lib v0.0.0-20220413173135-69508ca741d7/go.mod h1:v0hIh31iwDGbkkdeSSppdMNm1oIigfCA2mG2XajKnf8=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
|
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
|
||||||
github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk=
|
github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk=
|
||||||
|
|||||||
@@ -329,7 +329,7 @@ func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error {
|
|||||||
TapperDaemonSetName,
|
TapperDaemonSetName,
|
||||||
tapperSyncer.config.AgentImage,
|
tapperSyncer.config.AgentImage,
|
||||||
TapperPodName,
|
TapperPodName,
|
||||||
fmt.Sprintf("%s.%s.svc.cluster.local", ApiServerPodName, tapperSyncer.config.MizuResourcesNamespace),
|
fmt.Sprintf("%s.%s.svc", ApiServerPodName, tapperSyncer.config.MizuResourcesNamespace),
|
||||||
nodeNames,
|
nodeNames,
|
||||||
serviceAccountName,
|
serviceAccountName,
|
||||||
tapperSyncer.config.TapperResources,
|
tapperSyncer.config.TapperResources,
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ func (e *Emitting) Emit(item *OutputChannelItem) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Entry struct {
|
type Entry struct {
|
||||||
Id uint `json:"id"`
|
Id string `json:"id"`
|
||||||
Protocol Protocol `json:"proto"`
|
Protocol Protocol `json:"proto"`
|
||||||
Capture Capture `json:"capture"`
|
Capture Capture `json:"capture"`
|
||||||
Source *TCP `json:"src"`
|
Source *TCP `json:"src"`
|
||||||
@@ -188,7 +188,7 @@ type EntryWrapper struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type BaseEntry struct {
|
type BaseEntry struct {
|
||||||
Id uint `json:"id"`
|
Id string `json:"id"`
|
||||||
Protocol Protocol `json:"proto,omitempty"`
|
Protocol Protocol `json:"proto,omitempty"`
|
||||||
Capture Capture `json:"capture"`
|
Capture Capture `json:"capture"`
|
||||||
Summary string `json:"summary,omitempty"`
|
Summary string `json:"summary,omitempty"`
|
||||||
|
|||||||
@@ -13,4 +13,4 @@ test-pull-bin:
|
|||||||
|
|
||||||
test-pull-expect:
|
test-pull-expect:
|
||||||
@mkdir -p expect
|
@mkdir -p expect
|
||||||
@[ "${skipexpect}" ] && echo "Skipping downloading expected JSONs" || gsutil -o 'GSUtil:parallel_process_count=5' -o 'GSUtil:parallel_thread_count=5' -m cp -r gs://static.up9.io/mizu/test-pcap/expect6/amqp/\* expect
|
@[ "${skipexpect}" ] && echo "Skipping downloading expected JSONs" || gsutil -o 'GSUtil:parallel_process_count=5' -o 'GSUtil:parallel_thread_count=5' -m cp -r gs://static.up9.io/mizu/test-pcap/expect7/amqp/\* expect
|
||||||
|
|||||||
@@ -13,4 +13,4 @@ test-pull-bin:
|
|||||||
|
|
||||||
test-pull-expect:
|
test-pull-expect:
|
||||||
@mkdir -p expect
|
@mkdir -p expect
|
||||||
@[ "${skipexpect}" ] && echo "Skipping downloading expected JSONs" || gsutil -o 'GSUtil:parallel_process_count=5' -o 'GSUtil:parallel_thread_count=5' -m cp -r gs://static.up9.io/mizu/test-pcap/expect6/http/\* expect
|
@[ "${skipexpect}" ] && echo "Skipping downloading expected JSONs" || gsutil -o 'GSUtil:parallel_process_count=5' -o 'GSUtil:parallel_thread_count=5' -m cp -r gs://static.up9.io/mizu/test-pcap/expect7/http/\* expect
|
||||||
|
|||||||
@@ -13,4 +13,4 @@ test-pull-bin:
|
|||||||
|
|
||||||
test-pull-expect:
|
test-pull-expect:
|
||||||
@mkdir -p expect
|
@mkdir -p expect
|
||||||
@[ "${skipexpect}" ] && echo "Skipping downloading expected JSONs" || gsutil -o 'GSUtil:parallel_process_count=5' -o 'GSUtil:parallel_thread_count=5' -m cp -r gs://static.up9.io/mizu/test-pcap/expect6/kafka/\* expect
|
@[ "${skipexpect}" ] && echo "Skipping downloading expected JSONs" || gsutil -o 'GSUtil:parallel_process_count=5' -o 'GSUtil:parallel_thread_count=5' -m cp -r gs://static.up9.io/mizu/test-pcap/expect7/kafka/\* expect
|
||||||
|
|||||||
@@ -13,4 +13,4 @@ test-pull-bin:
|
|||||||
|
|
||||||
test-pull-expect:
|
test-pull-expect:
|
||||||
@mkdir -p expect
|
@mkdir -p expect
|
||||||
@[ "${skipexpect}" ] && echo "Skipping downloading expected JSONs" || gsutil -o 'GSUtil:parallel_process_count=5' -o 'GSUtil:parallel_thread_count=5' -m cp -r gs://static.up9.io/mizu/test-pcap/expect6/redis/\* expect
|
@[ "${skipexpect}" ] && echo "Skipping downloading expected JSONs" || gsutil -o 'GSUtil:parallel_process_count=5' -o 'GSUtil:parallel_thread_count=5' -m cp -r gs://static.up9.io/mizu/test-pcap/expect7/redis/\* expect
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ const (
|
|||||||
MaxBufferedPagesTotalEnvVarName = "MAX_BUFFERED_PAGES_TOTAL"
|
MaxBufferedPagesTotalEnvVarName = "MAX_BUFFERED_PAGES_TOTAL"
|
||||||
MaxBufferedPagesPerConnectionEnvVarName = "MAX_BUFFERED_PAGES_PER_CONNECTION"
|
MaxBufferedPagesPerConnectionEnvVarName = "MAX_BUFFERED_PAGES_PER_CONNECTION"
|
||||||
TcpStreamChannelTimeoutMsEnvVarName = "TCP_STREAM_CHANNEL_TIMEOUT_MS"
|
TcpStreamChannelTimeoutMsEnvVarName = "TCP_STREAM_CHANNEL_TIMEOUT_MS"
|
||||||
|
CloseTimedoutTcpChannelsIntervalMsEnvVar = "CLOSE_TIMEDOUT_TCP_STREAM_CHANNELS_INTERVAL_MS"
|
||||||
MaxBufferedPagesTotalDefaultValue = 5000
|
MaxBufferedPagesTotalDefaultValue = 5000
|
||||||
MaxBufferedPagesPerConnectionDefaultValue = 5000
|
MaxBufferedPagesPerConnectionDefaultValue = 5000
|
||||||
TcpStreamChannelTimeoutMsDefaultValue = 10000
|
TcpStreamChannelTimeoutMsDefaultValue = 10000
|
||||||
|
|||||||
@@ -5,11 +5,12 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/up9inc/mizu/shared/logger"
|
"github.com/up9inc/mizu/shared/logger"
|
||||||
|
"github.com/up9inc/mizu/tap/api"
|
||||||
"github.com/vishvananda/netns"
|
"github.com/vishvananda/netns"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newNetnsPacketSource(procfs string, pid string,
|
func newNetnsPacketSource(procfs string, pid string, interfaceName string,
|
||||||
interfaceName string, behaviour TcpPacketSourceBehaviour) (*tcpPacketSource, error) {
|
behaviour TcpPacketSourceBehaviour, origin api.Capture) (*tcpPacketSource, error) {
|
||||||
nsh, err := netns.GetFromPath(fmt.Sprintf("%s/%s/ns/net", procfs, pid))
|
nsh, err := netns.GetFromPath(fmt.Sprintf("%s/%s/ns/net", procfs, pid))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -17,7 +18,7 @@ func newNetnsPacketSource(procfs string, pid string,
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
src, err := newPacketSourceFromNetnsHandle(pid, nsh, interfaceName, behaviour)
|
src, err := newPacketSourceFromNetnsHandle(pid, nsh, interfaceName, behaviour, origin)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Log.Errorf("Error starting netns packet source for %s - %w", pid, err)
|
logger.Log.Errorf("Error starting netns packet source for %s - %w", pid, err)
|
||||||
@@ -28,7 +29,7 @@ func newNetnsPacketSource(procfs string, pid string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func newPacketSourceFromNetnsHandle(pid string, nsh netns.NsHandle, interfaceName string,
|
func newPacketSourceFromNetnsHandle(pid string, nsh netns.NsHandle, interfaceName string,
|
||||||
behaviour TcpPacketSourceBehaviour) (*tcpPacketSource, error) {
|
behaviour TcpPacketSourceBehaviour, origin api.Capture) (*tcpPacketSource, error) {
|
||||||
|
|
||||||
done := make(chan *tcpPacketSource)
|
done := make(chan *tcpPacketSource)
|
||||||
errors := make(chan error)
|
errors := make(chan error)
|
||||||
@@ -57,7 +58,7 @@ func newPacketSourceFromNetnsHandle(pid string, nsh netns.NsHandle, interfaceNam
|
|||||||
}
|
}
|
||||||
|
|
||||||
name := fmt.Sprintf("netns-%s-%s", pid, interfaceName)
|
name := fmt.Sprintf("netns-%s-%s", pid, interfaceName)
|
||||||
src, err := newTcpPacketSource(name, "", interfaceName, behaviour)
|
src, err := newTcpPacketSource(name, "", interfaceName, behaviour, origin)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Log.Errorf("Error listening to PID %s - %w", pid, err)
|
logger.Log.Errorf("Error listening to PID %s - %w", pid, err)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/up9inc/mizu/shared/logger"
|
"github.com/up9inc/mizu/shared/logger"
|
||||||
|
"github.com/up9inc/mizu/tap/api"
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -37,10 +38,10 @@ func NewPacketSourceManager(procfs string, filename string, interfaceName string
|
|||||||
}
|
}
|
||||||
|
|
||||||
sourceManager.config = PacketSourceManagerConfig{
|
sourceManager.config = PacketSourceManagerConfig{
|
||||||
mtls: mtls,
|
mtls: mtls,
|
||||||
procfs: procfs,
|
procfs: procfs,
|
||||||
interfaceName: interfaceName,
|
interfaceName: interfaceName,
|
||||||
behaviour: behaviour,
|
behaviour: behaviour,
|
||||||
}
|
}
|
||||||
|
|
||||||
go hostSource.readPackets(ipdefrag, packets)
|
go hostSource.readPackets(ipdefrag, packets)
|
||||||
@@ -56,7 +57,7 @@ func newHostPacketSource(filename string, interfaceName string,
|
|||||||
name = fmt.Sprintf("file-%s", filename)
|
name = fmt.Sprintf("file-%s", filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
source, err := newTcpPacketSource(name, filename, interfaceName, behaviour)
|
source, err := newTcpPacketSource(name, filename, interfaceName, behaviour, api.Pcap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -85,9 +86,9 @@ func (m *PacketSourceManager) updateMtlsPods(procfs string, pods []v1.Pod,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for pid := range relevantPids {
|
for pid, origin := range relevantPids {
|
||||||
if _, ok := m.sources[pid]; !ok {
|
if _, ok := m.sources[pid]; !ok {
|
||||||
source, err := newNetnsPacketSource(procfs, pid, interfaceName, behaviour)
|
source, err := newNetnsPacketSource(procfs, pid, interfaceName, behaviour, origin)
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
go source.readPackets(ipdefrag, packets)
|
go source.readPackets(ipdefrag, packets)
|
||||||
@@ -97,15 +98,15 @@ func (m *PacketSourceManager) updateMtlsPods(procfs string, pods []v1.Pod,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PacketSourceManager) getRelevantPids(procfs string, pods []v1.Pod) map[string]bool {
|
func (m *PacketSourceManager) getRelevantPids(procfs string, pods []v1.Pod) map[string]api.Capture {
|
||||||
relevantPids := make(map[string]bool)
|
relevantPids := make(map[string]api.Capture)
|
||||||
relevantPids[hostSourcePid] = true
|
relevantPids[hostSourcePid] = api.Pcap
|
||||||
|
|
||||||
if envoyPids, err := discoverRelevantEnvoyPids(procfs, pods); err != nil {
|
if envoyPids, err := discoverRelevantEnvoyPids(procfs, pods); err != nil {
|
||||||
logger.Log.Warningf("Unable to discover envoy pids - %w", err)
|
logger.Log.Warningf("Unable to discover envoy pids - %w", err)
|
||||||
} else {
|
} else {
|
||||||
for _, pid := range envoyPids {
|
for _, pid := range envoyPids {
|
||||||
relevantPids[pid] = true
|
relevantPids[pid] = api.Envoy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,7 +114,7 @@ func (m *PacketSourceManager) getRelevantPids(procfs string, pods []v1.Pod) map[
|
|||||||
logger.Log.Warningf("Unable to discover linkerd pids - %w", err)
|
logger.Log.Warningf("Unable to discover linkerd pids - %w", err)
|
||||||
} else {
|
} else {
|
||||||
for _, pid := range linkerdPids {
|
for _, pid := range linkerdPids {
|
||||||
relevantPids[pid] = true
|
relevantPids[pid] = api.Linkerd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/google/gopacket/layers"
|
"github.com/google/gopacket/layers"
|
||||||
"github.com/google/gopacket/pcap"
|
"github.com/google/gopacket/pcap"
|
||||||
"github.com/up9inc/mizu/shared/logger"
|
"github.com/up9inc/mizu/shared/logger"
|
||||||
|
"github.com/up9inc/mizu/tap/api"
|
||||||
"github.com/up9inc/mizu/tap/diagnose"
|
"github.com/up9inc/mizu/tap/diagnose"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,6 +20,7 @@ type tcpPacketSource struct {
|
|||||||
defragger *ip4defrag.IPv4Defragmenter
|
defragger *ip4defrag.IPv4Defragmenter
|
||||||
Behaviour *TcpPacketSourceBehaviour
|
Behaviour *TcpPacketSourceBehaviour
|
||||||
name string
|
name string
|
||||||
|
Origin api.Capture
|
||||||
}
|
}
|
||||||
|
|
||||||
type TcpPacketSourceBehaviour struct {
|
type TcpPacketSourceBehaviour struct {
|
||||||
@@ -36,13 +38,14 @@ type TcpPacketInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func newTcpPacketSource(name, filename string, interfaceName string,
|
func newTcpPacketSource(name, filename string, interfaceName string,
|
||||||
behaviour TcpPacketSourceBehaviour) (*tcpPacketSource, error) {
|
behaviour TcpPacketSourceBehaviour, origin api.Capture) (*tcpPacketSource, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
result := &tcpPacketSource{
|
result := &tcpPacketSource{
|
||||||
name: name,
|
name: name,
|
||||||
defragger: ip4defrag.NewIPv4Defragmenter(),
|
defragger: ip4defrag.NewIPv4Defragmenter(),
|
||||||
Behaviour: &behaviour,
|
Behaviour: &behaviour,
|
||||||
|
Origin: origin,
|
||||||
}
|
}
|
||||||
|
|
||||||
if filename != "" {
|
if filename != "" {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ type tcpAssembler struct {
|
|||||||
// The assembler context
|
// The assembler context
|
||||||
type context struct {
|
type context struct {
|
||||||
CaptureInfo gopacket.CaptureInfo
|
CaptureInfo gopacket.CaptureInfo
|
||||||
|
Origin api.Capture
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *context) GetCaptureInfo() gopacket.CaptureInfo {
|
func (c *context) GetCaptureInfo() gopacket.CaptureInfo {
|
||||||
@@ -87,8 +88,10 @@ func (a *tcpAssembler) processPackets(dumpPacket bool, packets <-chan source.Tcp
|
|||||||
logger.Log.Fatalf("Failed to set network layer for checksum: %s", err)
|
logger.Log.Fatalf("Failed to set network layer for checksum: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c := context{
|
c := context{
|
||||||
CaptureInfo: packet.Metadata().CaptureInfo,
|
CaptureInfo: packet.Metadata().CaptureInfo,
|
||||||
|
Origin: packetInfo.Source.Origin,
|
||||||
}
|
}
|
||||||
diagnose.InternalStats.Totalsz += len(tcp.Payload)
|
diagnose.InternalStats.Totalsz += len(tcp.Payload)
|
||||||
a.assemblerMutex.Lock()
|
a.assemblerMutex.Lock()
|
||||||
|
|||||||
@@ -98,8 +98,7 @@ func (h *tcpReader) Close() {
|
|||||||
func (h *tcpReader) run(wg *sync.WaitGroup) {
|
func (h *tcpReader) run(wg *sync.WaitGroup) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
b := bufio.NewReader(h)
|
b := bufio.NewReader(h)
|
||||||
// TODO: Add api.Pcap, api.Envoy and api.Linkerd distinction by refactoring NewPacketSourceManager method
|
err := h.extension.Dissector.Dissect(b, h.progress, h.parent.origin, h.isClient, h.tcpID, h.counterPair, h.superTimer, h.parent.superIdentifier, h.emitter, filteringOptions, h.reqResMatcher)
|
||||||
err := h.extension.Dissector.Dissect(b, h.progress, api.Pcap, h.isClient, h.tcpID, h.counterPair, h.superTimer, h.parent.superIdentifier, h.emitter, filteringOptions, h.reqResMatcher)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_, err = io.Copy(ioutil.Discard, b)
|
_, err = io.Copy(ioutil.Discard, b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ type tcpStream struct {
|
|||||||
clients []tcpReader
|
clients []tcpReader
|
||||||
servers []tcpReader
|
servers []tcpReader
|
||||||
ident string
|
ident string
|
||||||
|
origin api.Capture
|
||||||
sync.Mutex
|
sync.Mutex
|
||||||
streamsMap *tcpStreamMap
|
streamsMap *tcpStreamMap
|
||||||
}
|
}
|
||||||
@@ -70,6 +71,9 @@ func (t *tcpStream) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir reassem
|
|||||||
if !accept {
|
if !accept {
|
||||||
diagnose.InternalStats.RejectOpt++
|
diagnose.InternalStats.RejectOpt++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*start = true
|
||||||
|
|
||||||
return accept
|
return accept
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ func (factory *tcpStreamFactory) New(net, transport gopacket.Flow, tcp *layers.T
|
|||||||
optchecker: reassembly.NewTCPOptionCheck(),
|
optchecker: reassembly.NewTCPOptionCheck(),
|
||||||
superIdentifier: &api.SuperIdentifier{},
|
superIdentifier: &api.SuperIdentifier{},
|
||||||
streamsMap: factory.streamsMap,
|
streamsMap: factory.streamsMap,
|
||||||
|
origin: getPacketOrigin(ac),
|
||||||
}
|
}
|
||||||
if stream.isTapTarget {
|
if stream.isTapTarget {
|
||||||
stream.id = factory.streamsMap.nextId()
|
stream.id = factory.streamsMap.nextId()
|
||||||
@@ -182,6 +183,17 @@ func (factory *tcpStreamFactory) shouldNotifyOnOutboundLink(dstIP string, dstPor
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getPacketOrigin(ac reassembly.AssemblerContext) api.Capture {
|
||||||
|
c, ok := ac.(*context)
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
// If ac is not our context, fallback to Pcap
|
||||||
|
return api.Pcap
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Origin
|
||||||
|
}
|
||||||
|
|
||||||
type streamProps struct {
|
type streamProps struct {
|
||||||
isTapTarget bool
|
isTapTarget bool
|
||||||
isOutgoing bool
|
isOutgoing bool
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package tap
|
package tap
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
_debug "runtime/debug"
|
_debug "runtime/debug"
|
||||||
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -34,10 +36,35 @@ func (streamMap *tcpStreamMap) nextId() int64 {
|
|||||||
return streamMap.streamId
|
return streamMap.streamId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (streamMap *tcpStreamMap) getCloseTimedoutTcpChannelsInterval() time.Duration {
|
||||||
|
defaultDuration := 1000 * time.Millisecond
|
||||||
|
rangeMin := 10
|
||||||
|
rangeMax := 10000
|
||||||
|
closeTimedoutTcpChannelsIntervalMsStr := os.Getenv(CloseTimedoutTcpChannelsIntervalMsEnvVar)
|
||||||
|
if closeTimedoutTcpChannelsIntervalMsStr == "" {
|
||||||
|
return defaultDuration
|
||||||
|
} else {
|
||||||
|
closeTimedoutTcpChannelsIntervalMs, err := strconv.Atoi(closeTimedoutTcpChannelsIntervalMsStr)
|
||||||
|
if err != nil {
|
||||||
|
logger.Log.Warningf("Error parsing environment variable %s: %v\n", CloseTimedoutTcpChannelsIntervalMsEnvVar, err)
|
||||||
|
return defaultDuration
|
||||||
|
} else {
|
||||||
|
if closeTimedoutTcpChannelsIntervalMs < rangeMin || closeTimedoutTcpChannelsIntervalMs > rangeMax {
|
||||||
|
logger.Log.Warningf("The value of environment variable %s is not in acceptable range: %d - %d\n", CloseTimedoutTcpChannelsIntervalMsEnvVar, rangeMin, rangeMax)
|
||||||
|
return defaultDuration
|
||||||
|
} else {
|
||||||
|
return time.Duration(closeTimedoutTcpChannelsIntervalMs) * time.Millisecond
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (streamMap *tcpStreamMap) closeTimedoutTcpStreamChannels() {
|
func (streamMap *tcpStreamMap) closeTimedoutTcpStreamChannels() {
|
||||||
tcpStreamChannelTimeout := GetTcpChannelTimeoutMs()
|
tcpStreamChannelTimeout := GetTcpChannelTimeoutMs()
|
||||||
|
closeTimedoutTcpChannelsIntervalMs := streamMap.getCloseTimedoutTcpChannelsInterval()
|
||||||
|
logger.Log.Infof("Using %d ms as the close timedout TCP stream channels interval", closeTimedoutTcpChannelsIntervalMs/time.Millisecond)
|
||||||
for {
|
for {
|
||||||
time.Sleep(10 * time.Millisecond)
|
time.Sleep(closeTimedoutTcpChannelsIntervalMs)
|
||||||
_debug.FreeOSMemory()
|
_debug.FreeOSMemory()
|
||||||
streamMap.streams.Range(func(key interface{}, value interface{}) bool {
|
streamMap.streams.Range(func(key interface{}, value interface{}) bool {
|
||||||
streamWrapper := value.(*tcpStreamWrapper)
|
streamWrapper := value.(*tcpStreamWrapper)
|
||||||
@@ -47,7 +74,7 @@ func (streamMap *tcpStreamMap) closeTimedoutTcpStreamChannels() {
|
|||||||
stream.Close()
|
stream.Close()
|
||||||
diagnose.AppStats.IncDroppedTcpStreams()
|
diagnose.AppStats.IncDroppedTcpStreams()
|
||||||
logger.Log.Debugf("Dropped an unidentified TCP stream because of timeout. Total dropped: %d Total Goroutines: %d Timeout (ms): %d",
|
logger.Log.Debugf("Dropped an unidentified TCP stream because of timeout. Total dropped: %d Total Goroutines: %d Timeout (ms): %d",
|
||||||
diagnose.AppStats.DroppedTcpStreams, runtime.NumGoroutine(), tcpStreamChannelTimeout/1000000)
|
diagnose.AppStats.DroppedTcpStreams, runtime.NumGoroutine(), tcpStreamChannelTimeout/time.Millisecond)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if !stream.superIdentifier.IsClosedOthers {
|
if !stream.superIdentifier.IsClosedOthers {
|
||||||
|
|||||||
@@ -26,15 +26,16 @@
|
|||||||
"@material-ui/core": "^4.11.3",
|
"@material-ui/core": "^4.11.3",
|
||||||
"@material-ui/icons": "^4.11.2",
|
"@material-ui/icons": "^4.11.2",
|
||||||
"@material-ui/lab": "^4.0.0-alpha.60",
|
"@material-ui/lab": "^4.0.0-alpha.60",
|
||||||
|
"@types/jest": "^26.0.22",
|
||||||
|
"@types/node": "^12.20.10",
|
||||||
"node-sass": "^6.0.0",
|
"node-sass": "^6.0.0",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
|
||||||
"recoil": "^0.5.2",
|
|
||||||
"react-copy-to-clipboard": "^5.0.3",
|
"react-copy-to-clipboard": "^5.0.3",
|
||||||
"@types/jest": "^26.0.22",
|
"react-dom": "^17.0.2",
|
||||||
"@types/node": "^12.20.10"
|
"recoil": "^0.5.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@craco/craco": "^6.4.3",
|
||||||
"@types/lodash": "^4.14.179",
|
"@types/lodash": "^4.14.179",
|
||||||
"@uiw/react-textarea-code-editor": "^1.4.12",
|
"@uiw/react-textarea-code-editor": "^1.4.12",
|
||||||
"axios": "^0.25.0",
|
"axios": "^0.25.0",
|
||||||
@@ -49,7 +50,6 @@
|
|||||||
"node-fetch": "^3.1.1",
|
"node-fetch": "^3.1.1",
|
||||||
"numeral": "^2.0.6",
|
"numeral": "^2.0.6",
|
||||||
"protobuf-decoder": "^0.1.0",
|
"protobuf-decoder": "^0.1.0",
|
||||||
"react-resizable": "^3.0.4",
|
|
||||||
"react-graph-vis": "^1.0.7",
|
"react-graph-vis": "^1.0.7",
|
||||||
"react-lowlight": "^3.0.0",
|
"react-lowlight": "^3.0.0",
|
||||||
"react-router-dom": "^6.2.1",
|
"react-router-dom": "^6.2.1",
|
||||||
@@ -59,8 +59,7 @@
|
|||||||
"redoc": "^2.0.0-rc.59",
|
"redoc": "^2.0.0-rc.59",
|
||||||
"styled-components": "^5.3.3",
|
"styled-components": "^5.3.3",
|
||||||
"web-vitals": "^1.1.1",
|
"web-vitals": "^1.1.1",
|
||||||
"xml-formatter": "^2.6.0",
|
"xml-formatter": "^2.6.0"
|
||||||
"@craco/craco": "^6.4.3"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@rollup/plugin-node-resolve": "^13.1.3",
|
"@rollup/plugin-node-resolve": "^13.1.3",
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
.modalContainer
|
.modalContainer
|
||||||
display: flex
|
display: flex
|
||||||
flex-wrap: nowrap
|
|
||||||
width: 100%
|
width: 100%
|
||||||
height: 100%
|
height: 100%
|
||||||
|
|
||||||
@@ -11,8 +10,6 @@
|
|||||||
|
|
||||||
.filterSection
|
.filterSection
|
||||||
flex: 15%
|
flex: 15%
|
||||||
border-right: 1px solid $blue-color
|
|
||||||
margin-right: 2%
|
|
||||||
height: 100%
|
height: 100%
|
||||||
|
|
||||||
.filters table
|
.filters table
|
||||||
@@ -38,6 +35,7 @@
|
|||||||
display: flex
|
display: flex
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
margin-right: 10px
|
margin-right: 10px
|
||||||
|
width: 100%
|
||||||
|
|
||||||
.servicesFilterSearch
|
.servicesFilterSearch
|
||||||
width: calc(100% - 10px)
|
width: calc(100% - 10px)
|
||||||
@@ -47,7 +45,7 @@
|
|||||||
margin-bottom: 5px
|
margin-bottom: 5px
|
||||||
|
|
||||||
.servicesFilter
|
.servicesFilter
|
||||||
margin-top: clamp(25px,15%,35px)
|
margin-top: 15px
|
||||||
height: 100%
|
height: 100%
|
||||||
overflow: hidden
|
overflow: hidden
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,9 @@ import closeIcon from "assets/close.svg"
|
|||||||
import styles from './ServiceMapModal.module.sass'
|
import styles from './ServiceMapModal.module.sass'
|
||||||
import SelectList from "../UI/SelectList";
|
import SelectList from "../UI/SelectList";
|
||||||
import { GraphData, ServiceMapGraph } from "./ServiceMapModalTypes"
|
import { GraphData, ServiceMapGraph } from "./ServiceMapModalTypes"
|
||||||
import { ResizableBox } from "react-resizable"
|
|
||||||
import "react-resizable/css/styles.css"
|
|
||||||
import { Utils } from "../../helpers/Utils";
|
import { Utils } from "../../helpers/Utils";
|
||||||
import { TOAST_CONTAINER_ID } from "../../configs/Consts";
|
import { TOAST_CONTAINER_ID } from "../../configs/Consts";
|
||||||
|
import Resizeable from "../UI/Resizeable"
|
||||||
|
|
||||||
const modalStyle = {
|
const modalStyle = {
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
@@ -176,9 +175,8 @@ export const ServiceMapModal: React.FC<ServiceMapModalProps> = ({ isOpen, onClos
|
|||||||
<Fade in={isOpen}>
|
<Fade in={isOpen}>
|
||||||
<Box sx={modalStyle}>
|
<Box sx={modalStyle}>
|
||||||
<div className={styles.modalContainer}>
|
<div className={styles.modalContainer}>
|
||||||
{/* TODO: remove error missing height */}
|
<div className={styles.filterSection}>
|
||||||
<ResizableBox width={200} style={{ height: '100%', minWidth: "200px" }} axis={"x"}>
|
<Resizeable minWidth={170}>
|
||||||
<div className={styles.filterSection}>
|
|
||||||
<div className={styles.filterWrapper}>
|
<div className={styles.filterWrapper}>
|
||||||
<div className={styles.protocolsFilterList}>
|
<div className={styles.protocolsFilterList}>
|
||||||
<SelectList items={protocols} checkBoxWidth="5%" tableName={"Protocols"} multiSelect={true}
|
<SelectList items={protocols} checkBoxWidth="5%" tableName={"Protocols"} multiSelect={true}
|
||||||
@@ -193,11 +191,11 @@ export const ServiceMapModal: React.FC<ServiceMapModalProps> = ({ isOpen, onClos
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</Resizeable>
|
||||||
</ResizableBox>
|
</div>
|
||||||
<div className={styles.graphSection}>
|
<div className={styles.graphSection}>
|
||||||
<div style={{ display: "flex", justifyContent: "space-between" }}>
|
<div style={{ display: "flex", justifyContent: "space-between" }}>
|
||||||
<Button style={{ marginRight: "3%" }}
|
<Button style={{ marginLeft: "3%" }}
|
||||||
startIcon={<img src={refreshIcon} className="custom" alt="refresh" style={{ marginRight: "8%" }}></img>}
|
startIcon={<img src={refreshIcon} className="custom" alt="refresh" style={{ marginRight: "8%" }}></img>}
|
||||||
size="medium"
|
size="medium"
|
||||||
variant="contained"
|
variant="contained"
|
||||||
@@ -206,7 +204,7 @@ export const ServiceMapModal: React.FC<ServiceMapModalProps> = ({ isOpen, onClos
|
|||||||
>
|
>
|
||||||
Refresh
|
Refresh
|
||||||
</Button>
|
</Button>
|
||||||
<img src={closeIcon} alt="close" onClick={() => onClose()} style={{ cursor: "pointer" }}></img>
|
<img src={closeIcon} alt="close" onClick={() => onClose()} style={{ cursor: "pointer", userSelect: "none" }}></img>
|
||||||
</div>
|
</div>
|
||||||
{isLoading && <div className={spinnerStyle.spinnerContainer}>
|
{isLoading && <div className={spinnerStyle.spinnerContainer}>
|
||||||
<img alt="spinner" src={spinnerImg} style={{ height: 50 }} />
|
<img alt="spinner" src={spinnerImg} style={{ height: 50 }} />
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ export const EntriesList: React.FC<EntriesListProps> = ({
|
|||||||
const [startTime, setStartTime] = useState(0);
|
const [startTime, setStartTime] = useState(0);
|
||||||
const [truncatedTimestamp, setTruncatedTimestamp] = useState(0);
|
const [truncatedTimestamp, setTruncatedTimestamp] = useState(0);
|
||||||
|
|
||||||
const leftOffBottom = entries.length > 0 ? entries[entries.length - 1].id + 1 : -1;
|
const leftOffBottom = entries.length > 0 ? entries[entries.length - 1].id : "latest";
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const list = document.getElementById('list').firstElementChild;
|
const list = document.getElementById('list').firstElementChild;
|
||||||
@@ -76,7 +76,7 @@ export const EntriesList: React.FC<EntriesListProps> = ({
|
|||||||
|
|
||||||
const getOldEntries = useCallback(async () => {
|
const getOldEntries = useCallback(async () => {
|
||||||
setLoadMoreTop(false);
|
setLoadMoreTop(false);
|
||||||
if (leftOffTop === null || leftOffTop <= 0) {
|
if (leftOffTop === "") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setIsLoadingTop(true);
|
setIsLoadingTop(true);
|
||||||
@@ -89,7 +89,7 @@ export const EntriesList: React.FC<EntriesListProps> = ({
|
|||||||
setLeftOffTop(data.meta.leftOff);
|
setLeftOffTop(data.meta.leftOff);
|
||||||
|
|
||||||
let scrollTo: boolean;
|
let scrollTo: boolean;
|
||||||
if (data.meta.leftOff === 0) {
|
if (data.meta.noMoreData) {
|
||||||
setNoMoreDataTop(true);
|
setNoMoreDataTop(true);
|
||||||
scrollTo = false;
|
scrollTo = false;
|
||||||
} else {
|
} else {
|
||||||
@@ -118,23 +118,31 @@ export const EntriesList: React.FC<EntriesListProps> = ({
|
|||||||
|
|
||||||
const scrollbarVisible = scrollableRef.current?.childWrapperRef.current.clientHeight > scrollableRef.current?.wrapperRef.current.clientHeight;
|
const scrollbarVisible = scrollableRef.current?.childWrapperRef.current.clientHeight > scrollableRef.current?.wrapperRef.current.clientHeight;
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!focusedEntryId && entries.length > 0)
|
||||||
|
setFocusedEntryId(entries[0].id);
|
||||||
|
}, [focusedEntryId, entries])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const newEntries = [...entries];
|
||||||
|
if (newEntries.length > 10000) {
|
||||||
|
setLeftOffTop(newEntries[0].id);
|
||||||
|
newEntries.splice(0, newEntries.length - 10000)
|
||||||
|
setNoMoreDataTop(false);
|
||||||
|
setEntries(newEntries);
|
||||||
|
}
|
||||||
|
}, [entries])
|
||||||
|
|
||||||
if (ws.current) {
|
if(ws.current && !ws.current.onmessage) {
|
||||||
ws.current.onmessage = (e) => {
|
ws.current.onmessage = (e) => {
|
||||||
if (!e?.data) return;
|
if (!e?.data) return;
|
||||||
const message = JSON.parse(e.data);
|
const message = JSON.parse(e.data);
|
||||||
switch (message.messageType) {
|
switch (message.messageType) {
|
||||||
case "entry":
|
case "entry":
|
||||||
const entry = message.data;
|
setEntries(entriesState => {
|
||||||
if (!focusedEntryId) setFocusedEntryId(entry.id.toString());
|
const newEntries = [...entriesState, message.data];
|
||||||
const newEntries = [...entries, entry];
|
return newEntries;
|
||||||
if (newEntries.length > 10000) {
|
});
|
||||||
setLeftOffTop(newEntries[0].id);
|
|
||||||
newEntries.splice(0, newEntries.length - 10000)
|
|
||||||
setNoMoreDataTop(false);
|
|
||||||
}
|
|
||||||
setEntries(newEntries);
|
|
||||||
break;
|
break;
|
||||||
case "status":
|
case "status":
|
||||||
setTappingStatus(message.tappingStatus);
|
setTappingStatus(message.tappingStatus);
|
||||||
@@ -151,14 +159,14 @@ export const EntriesList: React.FC<EntriesListProps> = ({
|
|||||||
case "queryMetadata":
|
case "queryMetadata":
|
||||||
setTruncatedTimestamp(message.data.truncatedTimestamp);
|
setTruncatedTimestamp(message.data.truncatedTimestamp);
|
||||||
setQueriedTotal(message.data.total);
|
setQueriedTotal(message.data.total);
|
||||||
if (leftOffTop === null) {
|
if (leftOffTop === "") {
|
||||||
setLeftOffTop(message.data.leftOff - 1);
|
setLeftOffTop(message.data.leftOff);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "startTime":
|
case "startTime":
|
||||||
setStartTime(message.data);
|
setStartTime(message.data);
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,7 +188,7 @@ export const EntriesList: React.FC<EntriesListProps> = ({
|
|||||||
</ScrollableFeedVirtualized>
|
</ScrollableFeedVirtualized>
|
||||||
<button type="button"
|
<button type="button"
|
||||||
title="Fetch old records"
|
title="Fetch old records"
|
||||||
className={`${styles.btnOld} ${!scrollbarVisible && leftOffTop > 0 ? styles.showButton : styles.hideButton}`}
|
className={`${styles.btnOld} ${!scrollbarVisible && leftOffTop !== "" ? styles.showButton : styles.hideButton}`}
|
||||||
onClick={(_) => {
|
onClick={(_) => {
|
||||||
trafficViewerApi.webSocket.close()
|
trafficViewerApi.webSocket.close()
|
||||||
getOldEntries();
|
getOldEntries();
|
||||||
@@ -193,9 +201,9 @@ export const EntriesList: React.FC<EntriesListProps> = ({
|
|||||||
onClick={(_) => {
|
onClick={(_) => {
|
||||||
if (isWsConnectionClosed) {
|
if (isWsConnectionClosed) {
|
||||||
if (query) {
|
if (query) {
|
||||||
openWebSocket(`(${query}) and leftOff(${leftOffBottom})`, false);
|
openWebSocket(`(${query}) and leftOff("${leftOffBottom}")`, false);
|
||||||
} else {
|
} else {
|
||||||
openWebSocket(`leftOff(${leftOffBottom})`, false);
|
openWebSocket(`leftOff("${leftOffBottom}")`, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scrollableRef.current.jumpToBottom();
|
scrollableRef.current.jumpToBottom();
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ export const EntryItem: React.FC<EntryProps> = ({entry, style, headingMode, name
|
|||||||
|
|
||||||
const [focusedEntryId, setFocusedEntryId] = useRecoilState(focusedEntryIdAtom);
|
const [focusedEntryId, setFocusedEntryId] = useRecoilState(focusedEntryIdAtom);
|
||||||
const [queryState, setQuery] = useRecoilState(queryAtom);
|
const [queryState, setQuery] = useRecoilState(queryAtom);
|
||||||
const isSelected = focusedEntryId === entry.id.toString();
|
const isSelected = focusedEntryId === entry.id;
|
||||||
|
|
||||||
const classification = getClassification(entry.status)
|
const classification = getClassification(entry.status)
|
||||||
const numberOfRules = entry.rules.numberOfRules
|
const numberOfRules = entry.rules.numberOfRules
|
||||||
@@ -144,12 +144,12 @@ export const EntryItem: React.FC<EntryProps> = ({entry, style, headingMode, name
|
|||||||
|
|
||||||
return <React.Fragment>
|
return <React.Fragment>
|
||||||
<div
|
<div
|
||||||
id={`entry-${entry.id.toString()}`}
|
id={`entry-${entry.id}`}
|
||||||
className={`${styles.row}
|
className={`${styles.row}
|
||||||
${isSelected && !rule && !contractEnabled ? styles.rowSelected : additionalRulesProperties}`}
|
${isSelected && !rule && !contractEnabled ? styles.rowSelected : additionalRulesProperties}`}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (!setFocusedEntryId) return;
|
if (!setFocusedEntryId) return;
|
||||||
setFocusedEntryId(entry.id.toString());
|
setFocusedEntryId(entry.id);
|
||||||
}}
|
}}
|
||||||
style={{
|
style={{
|
||||||
border: isSelected && !headingMode ? `1px ${entry.proto.backgroundColor} solid` : "1px transparent solid",
|
border: isSelected && !headingMode ? `1px ${entry.proto.backgroundColor} solid` : "1px transparent solid",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
flex-direction: column
|
flex-direction: column
|
||||||
overflow: hidden
|
overflow: hidden
|
||||||
flex-grow: 1
|
flex-grow: 1
|
||||||
height: calc(100vh - 70px)
|
height: calc(100% - 70px)
|
||||||
|
|
||||||
.TrafficPageHeader
|
.TrafficPageHeader
|
||||||
padding: 20px 24px
|
padding: 20px 24px
|
||||||
@@ -16,9 +16,8 @@
|
|||||||
justify-content: space-between
|
justify-content: space-between
|
||||||
|
|
||||||
.TrafficPageStreamStatus
|
.TrafficPageStreamStatus
|
||||||
display: flex
|
display: flex
|
||||||
align-items: center
|
align-items: center
|
||||||
|
|
||||||
|
|
||||||
.TrafficPageHeaderImage
|
.TrafficPageHeaderImage
|
||||||
width: 22px
|
width: 22px
|
||||||
@@ -113,4 +112,4 @@
|
|||||||
.playPauseIcon
|
.playPauseIcon
|
||||||
cursor: pointer
|
cursor: pointer
|
||||||
margin-right: 15px
|
margin-right: 15px
|
||||||
height: 30px
|
height: 30px
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import {StatusBar} from "../UI/StatusBar";
|
|||||||
import tappingStatusAtom from "../../recoil/tappingStatus/atom";
|
import tappingStatusAtom from "../../recoil/tappingStatus/atom";
|
||||||
import {TOAST_CONTAINER_ID} from "../../configs/Consts";
|
import {TOAST_CONTAINER_ID} from "../../configs/Consts";
|
||||||
import leftOffTopAtom from "../../recoil/leftOffTop";
|
import leftOffTopAtom from "../../recoil/leftOffTop";
|
||||||
|
import { DEFAULT_QUERY } from '../../hooks/useWS';
|
||||||
|
|
||||||
const useLayoutStyles = makeStyles(() => ({
|
const useLayoutStyles = makeStyles(() => ({
|
||||||
details: {
|
details: {
|
||||||
@@ -49,14 +50,15 @@ interface TrafficViewerProps {
|
|||||||
actionButtons?: JSX.Element,
|
actionButtons?: JSX.Element,
|
||||||
isShowStatusBar?: boolean,
|
isShowStatusBar?: boolean,
|
||||||
webSocketUrl: string,
|
webSocketUrl: string,
|
||||||
isCloseWebSocket: boolean,
|
shouldCloseWebSocket: boolean,
|
||||||
|
setShouldCloseWebSocket: (flag: boolean) => void,
|
||||||
isDemoBannerView: boolean
|
isDemoBannerView: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export const TrafficViewer: React.FC<TrafficViewerProps> = ({
|
export const TrafficViewer: React.FC<TrafficViewerProps> = ({
|
||||||
setAnalyzeStatus, trafficViewerApiProp,
|
setAnalyzeStatus, trafficViewerApiProp,
|
||||||
actionButtons, isShowStatusBar, webSocketUrl,
|
actionButtons, isShowStatusBar, webSocketUrl,
|
||||||
isCloseWebSocket, isDemoBannerView
|
shouldCloseWebSocket, setShouldCloseWebSocket, isDemoBannerView
|
||||||
}) => {
|
}) => {
|
||||||
|
|
||||||
const classes = useLayoutStyles();
|
const classes = useLayoutStyles();
|
||||||
@@ -104,8 +106,11 @@ export const TrafficViewer: React.FC<TrafficViewerProps> = ({
|
|||||||
}, [query, handleQueryChange]);
|
}, [query, handleQueryChange]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
isCloseWebSocket && closeWebSocket()
|
if(shouldCloseWebSocket){
|
||||||
}, [isCloseWebSocket])
|
closeWebSocket()
|
||||||
|
setShouldCloseWebSocket(false);
|
||||||
|
}
|
||||||
|
}, [shouldCloseWebSocket])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
reopenConnection()
|
reopenConnection()
|
||||||
@@ -115,9 +120,9 @@ export const TrafficViewer: React.FC<TrafficViewerProps> = ({
|
|||||||
|
|
||||||
const openEmptyWebSocket = () => {
|
const openEmptyWebSocket = () => {
|
||||||
if (query) {
|
if (query) {
|
||||||
openWebSocket(`(${query}) and leftOff(-1)`, true);
|
openWebSocket(`(${query}) and ${DEFAULT_QUERY}`, true);
|
||||||
} else {
|
} else {
|
||||||
openWebSocket(`leftOff(-1)`, true);
|
openWebSocket(DEFAULT_QUERY, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +138,7 @@ export const TrafficViewer: React.FC<TrafficViewerProps> = ({
|
|||||||
if (resetEntries) {
|
if (resetEntries) {
|
||||||
setFocusedEntryId(null);
|
setFocusedEntryId(null);
|
||||||
setEntries([]);
|
setEntries([]);
|
||||||
setLeftOffTop(null);
|
setLeftOffTop("");
|
||||||
setNoMoreDataTop(false);
|
setNoMoreDataTop(false);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@@ -295,11 +300,11 @@ const MemoiedTrafficViewer = React.memo(TrafficViewer)
|
|||||||
const TrafficViewerContainer: React.FC<TrafficViewerProps> = ({
|
const TrafficViewerContainer: React.FC<TrafficViewerProps> = ({
|
||||||
setAnalyzeStatus, trafficViewerApiProp,
|
setAnalyzeStatus, trafficViewerApiProp,
|
||||||
actionButtons, isShowStatusBar = true,
|
actionButtons, isShowStatusBar = true,
|
||||||
webSocketUrl, isCloseWebSocket, isDemoBannerView
|
webSocketUrl, shouldCloseWebSocket, setShouldCloseWebSocket, isDemoBannerView
|
||||||
}) => {
|
}) => {
|
||||||
return <RecoilRoot>
|
return <RecoilRoot>
|
||||||
<MemoiedTrafficViewer actionButtons={actionButtons} isShowStatusBar={isShowStatusBar} webSocketUrl={webSocketUrl}
|
<MemoiedTrafficViewer actionButtons={actionButtons} isShowStatusBar={isShowStatusBar} webSocketUrl={webSocketUrl}
|
||||||
isCloseWebSocket={isCloseWebSocket} trafficViewerApiProp={trafficViewerApiProp}
|
shouldCloseWebSocket={shouldCloseWebSocket} setShouldCloseWebSocket={setShouldCloseWebSocket} trafficViewerApiProp={trafficViewerApiProp}
|
||||||
setAnalyzeStatus={setAnalyzeStatus} isDemoBannerView={isDemoBannerView}/>
|
setAnalyzeStatus={setAnalyzeStatus} isDemoBannerView={isDemoBannerView}/>
|
||||||
<ToastContainer enableMultiContainer containerId={TOAST_CONTAINER_ID}
|
<ToastContainer enableMultiContainer containerId={TOAST_CONTAINER_ID}
|
||||||
position="bottom-right"
|
position="bottom-right"
|
||||||
|
|||||||
61
ui-common/src/components/UI/Resizeable.tsx
Normal file
61
ui-common/src/components/UI/Resizeable.tsx
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import React, { useRef, useState } from "react";
|
||||||
|
|
||||||
|
import styles from './style/Resizeable.module.sass'
|
||||||
|
|
||||||
|
export interface Props {
|
||||||
|
children
|
||||||
|
minWidth: number
|
||||||
|
}
|
||||||
|
|
||||||
|
const Resizeable: React.FC<Props> = ({ children, minWidth }) => {
|
||||||
|
const resizeble = useRef(null)
|
||||||
|
let mousePos = { x: 0, y: 0 }
|
||||||
|
let elementDimention = { w: 0, h: 0 }
|
||||||
|
let isPressed = false
|
||||||
|
const [elemWidth, setElemWidth] = useState(resizeble?.current?.style?.width)
|
||||||
|
|
||||||
|
const mouseDownHandler = function (e) {
|
||||||
|
// Get the current mouse position
|
||||||
|
mousePos = { x: e.clientX, y: e.clientY }
|
||||||
|
isPressed = true
|
||||||
|
|
||||||
|
// Calculate the dimension of element
|
||||||
|
const styles = resizeble.current.getBoundingClientRect();
|
||||||
|
elementDimention = { w: parseInt(styles.width, 10), h: parseInt(styles.height, 10) }
|
||||||
|
// Attach the listeners to `document`
|
||||||
|
window.addEventListener('mousemove', mouseMoveHandler);
|
||||||
|
window.addEventListener('mouseup', mouseUpHandler);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const mouseMoveHandler = function (e) {
|
||||||
|
if (isPressed) {
|
||||||
|
// How far the mouse has been moved
|
||||||
|
const dx = e.clientX - mousePos.x;
|
||||||
|
const widthEl = elementDimention.w + dx
|
||||||
|
|
||||||
|
if (widthEl >= minWidth)
|
||||||
|
// Adjust the dimension of element
|
||||||
|
setElemWidth(widthEl)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const mouseUpHandler = function () {
|
||||||
|
window.removeEventListener('mousemove', mouseMoveHandler);
|
||||||
|
window.removeEventListener('mouseup', mouseUpHandler);
|
||||||
|
isPressed = false
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<React.Fragment>
|
||||||
|
<div className={styles.resizable} ref={resizeble} style={{ width: elemWidth }}>
|
||||||
|
{children}
|
||||||
|
<div className={`${styles.resizer} ${styles.resizerRight}`} onMouseDown={mouseDownHandler}></div>
|
||||||
|
{/* <div className={`${styles.resizer} ${styles.resizerB}`} onMouseDown={mouseDownHandler}></div> -- FutureUse*/}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</React.Fragment>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Resizeable;
|
||||||
29
ui-common/src/components/UI/style/Resizeable.module.sass
Normal file
29
ui-common/src/components/UI/style/Resizeable.module.sass
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
@import "../../../variables.module"
|
||||||
|
|
||||||
|
.resizable
|
||||||
|
position: relative
|
||||||
|
align-items: center
|
||||||
|
display: flex
|
||||||
|
overflow: hidden
|
||||||
|
border-right: 1px solid $blue-color
|
||||||
|
height: 100%
|
||||||
|
width: 100%
|
||||||
|
padding-right: 3px
|
||||||
|
|
||||||
|
.resizer
|
||||||
|
position: absolute
|
||||||
|
|
||||||
|
&Right
|
||||||
|
cursor: col-resize
|
||||||
|
height: 100%
|
||||||
|
right: 0
|
||||||
|
top: 0
|
||||||
|
width: 5px
|
||||||
|
|
||||||
|
// FutureUse
|
||||||
|
&Bottom
|
||||||
|
bottom: 0
|
||||||
|
cursor: row-resize
|
||||||
|
height: 5px
|
||||||
|
left: 0
|
||||||
|
width: 100%
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
.selectListTable
|
.selectListTable
|
||||||
overflow: auto
|
overflow: auto
|
||||||
height: 100%
|
height: 100%
|
||||||
|
user-select: none // when resizble moved we get unwanted beheviour
|
||||||
|
|
||||||
table
|
table
|
||||||
width: 100%
|
width: 100%
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ enum WebSocketReadyState {
|
|||||||
CLOSED
|
CLOSED
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DEFAULT_QUERY = "leftOff(-1)";
|
export const DEFAULT_QUERY = `leftOff("latest")`;
|
||||||
|
|
||||||
const useWS = (wsUrl: string) => {
|
const useWS = (wsUrl: string) => {
|
||||||
const [message, setMessage] = useState(null);
|
const [message, setMessage] = useState(null);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { atom } from "recoil"
|
|||||||
|
|
||||||
const leftOffTopAtom = atom({
|
const leftOffTopAtom = atom({
|
||||||
key: "leftOffTopAtom",
|
key: "leftOffTopAtom",
|
||||||
default: null
|
default: ""
|
||||||
})
|
})
|
||||||
|
|
||||||
export default leftOffTopAtom;
|
export default leftOffTopAtom;
|
||||||
|
|||||||
@@ -6,3 +6,4 @@ body
|
|||||||
.mizuApp
|
.mizuApp
|
||||||
color: $font-color
|
color: $font-color
|
||||||
width: 100%
|
width: 100%
|
||||||
|
height: 100%
|
||||||
|
|||||||
@@ -21,17 +21,17 @@ export const TrafficPage: React.FC<TrafficPageProps> = ({ setAnalyzeStatus }) =>
|
|||||||
const commonClasses = useCommonStyles();
|
const commonClasses = useCommonStyles();
|
||||||
const [serviceMapModalOpen, setServiceMapModalOpen] = useRecoilState(serviceMapModalOpenAtom);
|
const [serviceMapModalOpen, setServiceMapModalOpen] = useRecoilState(serviceMapModalOpenAtom);
|
||||||
const [openOasModal, setOpenOasModal] = useRecoilState(oasModalOpenAtom);
|
const [openOasModal, setOpenOasModal] = useRecoilState(oasModalOpenAtom);
|
||||||
const [openWebSocket, setOpenWebSocket] = useState(true);
|
const [shouldCloseWebSocket, setShouldCloseWebSocket] = useState(false);
|
||||||
|
|
||||||
const trafficViewerApi = { ...api }
|
const trafficViewerApi = { ...api }
|
||||||
|
|
||||||
const handleOpenOasModal = () => {
|
const handleOpenOasModal = () => {
|
||||||
setOpenWebSocket(false)
|
setShouldCloseWebSocket(true)
|
||||||
setOpenOasModal(true);
|
setOpenOasModal(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
const openServiceMapModalDebounce = debounce(() => {
|
const openServiceMapModalDebounce = debounce(() => {
|
||||||
setOpenWebSocket(false)
|
setShouldCloseWebSocket(true)
|
||||||
setServiceMapModalOpen(true)
|
setServiceMapModalOpen(true)
|
||||||
}, 500);
|
}, 500);
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ export const TrafficPage: React.FC<TrafficPageProps> = ({ setAnalyzeStatus }) =>
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<TrafficViewer setAnalyzeStatus={setAnalyzeStatus} webSocketUrl={MizuWebsocketURL} isCloseWebSocket={!openWebSocket}
|
<TrafficViewer setAnalyzeStatus={setAnalyzeStatus} webSocketUrl={MizuWebsocketURL} shouldCloseWebSocket={shouldCloseWebSocket} setShouldCloseWebSocket={setShouldCloseWebSocket}
|
||||||
trafficViewerApiProp={trafficViewerApi} actionButtons={actionButtons} isShowStatusBar={!(openOasModal || serviceMapModalOpen)} isDemoBannerView={false} />
|
trafficViewerApiProp={trafficViewerApi} actionButtons={actionButtons} isShowStatusBar={!(openOasModal || serviceMapModalOpen)} isDemoBannerView={false} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
@import './variables.module'
|
@import './variables.module'
|
||||||
|
|
||||||
|
#root
|
||||||
|
height: 100%
|
||||||
|
|
||||||
html,
|
html,
|
||||||
body
|
body
|
||||||
height: 100%
|
height: 100%
|
||||||
@@ -153,4 +156,4 @@ button
|
|||||||
|
|
||||||
// enable view elements inside redoc
|
// enable view elements inside redoc
|
||||||
.sc-dwsnSq
|
.sc-dwsnSq
|
||||||
height: 80vh !important
|
height: 80vh !important
|
||||||
|
|||||||
Reference in New Issue
Block a user