Import From Raw Logs
This page outlines how any text-based logs can be integrated into Bublik.
The approach is to use a Python conversion script that creates a
Bublik-importable run bundle similar to TE.
Example Files
Use these downloadable example assets:
- Raw log example:
example_raw.log
View Example Raw Log
2026-04-21 12:00:00,000:[INFO ][runner ] MI: FORMAT_VERSION value=2
2026-04-21 12:00:00,001:[INFO ][runner ] MI: RUN_START name=example-ci
2026-04-21 12:00:00,002:[INFO ][runner ] MI: RUN_META key=TS_NAME value=example-ci
2026-04-21 12:00:00,003:[INFO ][runner ] MI: RUN_META key=PROJECT value=example
2026-04-21 12:00:00,004:[INFO ][runner ] MI: RUN_META key=CFG value=lab-host-01
2026-04-21 12:00:00,005:[INFO ][runner ] MI: RUN_META key=START_TIMESTAMP value=2026-04-21T12:00:00+03:00 type=timestamp
2026-04-21 12:00:00,006:[INFO ][runner ] MI: RUN_TAG key=tester value=example-ci
2026-04-21 12:00:00,007:[INFO ][runner ] MI: RUN_TAG key=device value=lab-host-01
2026-04-21 12:00:00,008:[INFO ][runner ] MI: RUN_TAG key=lab value=alpha-lab
2026-04-21 12:00:00,009:[INFO ][runner ] MI: RUN_TAG key=log_dir value=/var/log/example-ci
2026-04-21 12:00:00,010:[INFO ][runner ] MI: RUN_OBJECTIVE text="Demonstrate MI v2 raw-log conversion into a Bublik bundle."
2026-04-21 12:00:00,020:[INFO ][runner ] MI: TEST_START name=prologue
2026-04-21 12:00:00,021:[INFO ][runner ] MI: TEST_PARAM key=os value=ubuntu-24.04
2026-04-21 12:00:00,022:[INFO ][runner ] MI: TEST_PARAM key=kernel value=6.8.0
2026-04-21 12:00:00,023:[INFO ][runner ] MI: TEST_OBJECTIVE text="Prepare the host and confirm the test rig is ready."
2026-04-21 12:00:00,024:[INFO ][runner ] MI: STEP text="Load drivers"
2026-04-21 12:00:00,025:[INFO ][host_setup ] Loading nvme and vfio drivers
2026-04-21 12:00:00,026:[INFO ][host_setup ] Module nvme loaded successfully
2026-04-21 12:00:00,027:[INFO ][host_setup ] Module vfio-pci loaded successfully
2026-04-21 12:00:00,030:[INFO ][runner ] MI: STEP text="Check device visibility"
2026-04-21 12:00:00,031:[INFO ][host_setup ] Found /dev/nvme0n1
2026-04-21 12:00:00,032:[INFO ][host_setup ] PCI address 0000:03:00.0 is present in lspci output
2026-04-21 12:00:00,040:[INFO ][runner ] MI: RESULT status=PASSED expected=PASSED
2026-04-21 12:00:00,041:[INFO ][runner ] MI: TEST_END name=prologue status=PASSED
2026-04-21 12:00:00,050:[INFO ][runner ] MI: PACKAGE_START name=storage
2026-04-21 12:00:00,051:[INFO ][runner ] MI: PACKAGE_PARAM key=transport value=tcp
2026-04-21 12:00:00,052:[INFO ][runner ] MI: PACKAGE_PARAM key=lab_mode value=regression
2026-04-21 12:00:00,053:[INFO ][runner ] MI: PACKAGE_OBJECTIVE text="Run storage-oriented qualification scenarios."
2026-04-21 12:00:00,060:[INFO ][runner ] MI: PACKAGE_START name=identify
2026-04-21 12:00:00,061:[INFO ][runner ] MI: PACKAGE_OBJECTIVE text="Verify identify data remains stable across iterations."
2026-04-21 12:00:00,062:[INFO ][runner ] MI: TEST_START name=identify_basic
2026-04-21 12:00:00,063:[INFO ][runner ] MI: TEST_PARAM key=tool value=nvme-cli
2026-04-21 12:00:00,064:[INFO ][runner ] MI: TEST_OBJECTIVE text="Confirm controller and namespace identify output is consistent."
2026-04-21 12:00:00,065:[INFO ][runner ] MI: ITERATION_START name=identify_basic tin=0
2026-04-21 12:00:00,066:[INFO ][runner ] MI: ITERATION_PARAM key=namespace value=1
2026-04-21 12:00:00,067:[INFO ][runner ] MI: ITERATION_OBJECTIVE text="Capture the initial identify snapshot."
2026-04-21 12:00:00,068:[INFO ][runner ] MI: STEP text="Read controller identify data"
2026-04-21 12:00:00,069:[INFO ][nvmecli ] nvme id-ctrl /dev/nvme0
2026-04-21 12:00:00,069:[INFO ][nvmecli ] mn ExampleDrive 4TB
2026-04-21 12:00:00,070:[INFO ][nvmecli ] fr 1.2.3
2026-04-21 12:00:00,070:[INFO ][runner ] MI: RESULT status=PASSED expected=PASSED
2026-04-21 12:00:00,071:[INFO ][runner ] MI: ITERATION_END name=identify_basic tin=0 status=PASSED
2026-04-21 12:00:00,072:[INFO ][runner ] MI: ITERATION_START name=identify_basic tin=1
2026-04-21 12:00:00,073:[INFO ][runner ] MI: ITERATION_PARAM key=namespace value=1
2026-04-21 12:00:00,074:[INFO ][runner ] MI: ITERATION_OBJECTIVE text="Repeat identify collection after a short delay."
2026-04-21 12:00:00,075:[INFO ][runner ] MI: STEP text="Read namespace identify data"
2026-04-21 12:00:00,076:[INFO ][nvmecli ] nvme id-ns /dev/nvme0n1
2026-04-21 12:00:00,076:[INFO ][nvmecli ] nsze 7814037168
2026-04-21 12:00:00,077:[INFO ][nvmecli ] ncap 7814037168
2026-04-21 12:00:00,077:[INFO ][runner ] MI: RESULT status=PASSED expected=FAILED
2026-04-21 12:00:00,078:[WARN ][runner ] MI: VERDICT text="Operation unexpectedly succeeded"
2026-04-21 12:00:00,078:[INFO ][runner ] MI: ITERATION_END name=identify_basic tin=1 status=PASSED
2026-04-21 12:00:00,079:[INFO ][runner ] MI: TEST_END name=identify_basic status=PASSED
2026-04-21 12:00:00,080:[INFO ][runner ] MI: PACKAGE_END name=identify
2026-04-21 12:00:00,090:[INFO ][runner ] MI: PACKAGE_START name=io
2026-04-21 12:00:00,091:[INFO ][runner ] MI: PACKAGE_OBJECTIVE text="Measure throughput and latency under representative IO mixes."
2026-04-21 12:00:00,092:[INFO ][runner ] MI: TEST_START name=throughput_rw
2026-04-21 12:00:00,093:[INFO ][runner ] MI: TEST_PARAM key=tool value=fio
2026-04-21 12:00:00,094:[INFO ][runner ] MI: TEST_PARAM key=io_pattern value=rw
2026-04-21 12:00:00,095:[INFO ][runner ] MI: TEST_OBJECTIVE text="Check sustained mixed read/write throughput."
2026-04-21 12:00:00,096:[INFO ][runner ] MI: ITERATION_START name=throughput_rw tin=0
2026-04-21 12:00:00,097:[INFO ][runner ] MI: ITERATION_PARAM key=block_size value=128k
2026-04-21 12:00:00,098:[INFO ][runner ] MI: ITERATION_PARAM key=duration_sec value=10
2026-04-21 12:00:00,099:[INFO ][runner ] MI: ITERATION_OBJECTIVE text="Baseline mixed throughput run without warmup."
2026-04-21 12:00:00,100:[INFO ][runner ] MI: STEP text="Prepare fio job file"
2026-04-21 12:00:00,100:[INFO ][fio ] Writing job file /tmp/rw-128k.fio
2026-04-21 12:00:00,101:[INFO ][runner ] MI: STEP text="Run fio"
2026-04-21 12:00:00,102:[INFO ][fio ] fio job rw-128k started
2026-04-21 12:00:05,000:[INFO ][fio ] Jobs: 1 (f=1): [m(1)][50.0%][r=612MiB/s,w=404MiB/s][r=4892,w=3236 IOPS][eta 00m:05s]
2026-04-21 12:00:09,900:[INFO ][fio ] Jobs: 1 (f=1): [m(1)][99.0%][r=621MiB/s,w=410MiB/s][r=4968,w=3280 IOPS][eta 00m:00s]
2026-04-21 12:00:10,100:[INFO ][runner ] MI: MEASUREMENT name=read_bw_mib_s value=620.5 units=MiB/s tool=fio stage=throughput side=read
2026-04-21 12:00:10,101:[INFO ][runner ] MI: MEASUREMENT name=write_bw_mib_s value=410.2 units=MiB/s tool=fio stage=throughput side=write
2026-04-21 12:00:10,102:[INFO ][runner ] MI: ARTIFACT name=write_io value="158GiB (170GB)"
2026-04-21 12:00:10,103:[INFO ][runner ] MI: RESULT status=FAILED expected=PASSED err="Unexpected test result(s)"
2026-04-21 12:00:10,104:[ERROR ][runner ] MI: VERDICT text="Bandwidth below threshold"
2026-04-21 12:00:10,105:[INFO ][runner ] MI: ITERATION_END name=throughput_rw tin=0 status=FAILED
2026-04-21 12:00:10,106:[INFO ][runner ] MI: ITERATION_START name=throughput_rw tin=1
2026-04-21 12:00:10,107:[INFO ][runner ] MI: ITERATION_PARAM key=block_size value=128k
2026-04-21 12:00:10,108:[INFO ][runner ] MI: ITERATION_PARAM key=duration_sec value=10
2026-04-21 12:00:10,109:[INFO ][runner ] MI: ITERATION_PARAM key=warmup_sec value=2
2026-04-21 12:00:10,110:[INFO ][runner ] MI: ITERATION_OBJECTIVE text="Repeat the throughput run with warmup enabled."
2026-04-21 12:00:10,111:[INFO ][runner ] MI: STEP text="Prepare fio job file"
2026-04-21 12:00:10,111:[INFO ][fio ] Writing job file /tmp/rw-128k-warmup.fio
2026-04-21 12:00:10,112:[INFO ][runner ] MI: STEP text="Run fio"
2026-04-21 12:00:10,113:[INFO ][fio ] fio job rw-128k started
2026-04-21 12:00:12,200:[INFO ][fio ] Warmup phase completed
2026-04-21 12:00:18,000:[INFO ][fio ] Jobs: 1 (f=1): [m(1)][78.0%][r=657MiB/s,w=431MiB/s][r=5256,w=3448 IOPS][eta 00m:02s]
2026-04-21 12:00:20,111:[INFO ][runner ] MI: MEASUREMENT name=read_bw_mib_s value=655.0 units=MiB/s tool=fio stage=throughput side=read
2026-04-21 12:00:20,112:[INFO ][runner ] MI: MEASUREMENT name=write_bw_mib_s value=430.0 units=MiB/s tool=fio stage=throughput side=write
2026-04-21 12:00:20,113:[INFO ][runner ] MI: ARTIFACT name=write_io value="159GiB (171GB)"
2026-04-21 12:00:20,114:[INFO ][runner ] MI: RESULT status=FAILED expected=FAILED
2026-04-21 12:00:20,115:[WARN ][runner ] MI: VERDICT text="Known limitation reproduced"
2026-04-21 12:00:20,116:[INFO ][runner ] MI: ITERATION_END name=throughput_rw tin=1 status=FAILED
2026-04-21 12:00:20,116:[INFO ][runner ] MI: TEST_END name=throughput_rw status=FAILED
2026-04-21 12:00:20,120:[INFO ][runner ] MI: TEST_START name=latency_randread
2026-04-21 12:00:20,121:[INFO ][runner ] MI: TEST_PARAM key=tool value=fio
2026-04-21 12:00:20,122:[INFO ][runner ] MI: TEST_PARAM key=io_pattern value=randread
2026-04-21 12:00:20,123:[INFO ][runner ] MI: TEST_OBJECTIVE text="Check tail latency under random reads."
2026-04-21 12:00:20,124:[INFO ][runner ] MI: ITERATION_START name=latency_randread tin=0
2026-04-21 12:00:20,125:[INFO ][runner ] MI: ITERATION_PARAM key=iodepth value=32
2026-04-21 12:00:20,126:[INFO ][runner ] MI: ITERATION_OBJECTIVE text="Confirm the latency scenario is intentionally skipped in this environment."
2026-04-21 12:00:20,127:[INFO ][runner ] MI: STEP text="Evaluate random-read prerequisites"
2026-04-21 12:00:20,128:[INFO ][fio ] Random-read profile disabled by lab policy
2026-04-21 12:00:20,129:[INFO ][runner ] MI: RESULT status=SKIPPED expected=SKIPPED
2026-04-21 12:00:20,130:[INFO ][runner ] MI: ITERATION_END name=latency_randread tin=0 status=SKIPPED
2026-04-21 12:00:30,130:[INFO ][runner ] MI: ITERATION_START name=latency_randread tin=1
2026-04-21 12:00:30,131:[INFO ][runner ] MI: ITERATION_PARAM key=iodepth value=64
2026-04-21 12:00:30,132:[INFO ][runner ] MI: ITERATION_OBJECTIVE text="Show an unexpected skip when the scenario should have run."
2026-04-21 12:00:30,133:[INFO ][runner ] MI: STEP text="Evaluate random-read prerequisites"
2026-04-21 12:00:30,134:[WARN ][fio ] Random-read profile unavailable due to missing dataset
2026-04-21 12:00:30,135:[INFO ][runner ] MI: RESULT status=SKIPPED expected=PASSED
2026-04-21 12:00:30,136:[WARN ][runner ] MI: VERDICT text="Random-read path was unexpectedly unavailable"
2026-04-21 12:00:30,137:[INFO ][runner ] MI: ITERATION_END name=latency_randread tin=1 status=SKIPPED
2026-04-21 12:00:30,138:[INFO ][runner ] MI: TEST_END name=latency_randread status=SKIPPED
2026-04-21 12:00:40,137:[INFO ][runner ] MI: PACKAGE_END name=io
2026-04-21 12:00:40,150:[INFO ][runner ] MI: PACKAGE_START name=reliability
2026-04-21 12:00:40,151:[INFO ][runner ] MI: PACKAGE_OBJECTIVE text="Verify recovery after disruptive operations."
2026-04-21 12:00:40,152:[INFO ][runner ] MI: TEST_START name=power_cycle_recovery
2026-04-21 12:00:40,153:[INFO ][runner ] MI: TEST_PARAM key=cycles value=2
2026-04-21 12:00:40,154:[INFO ][runner ] MI: TEST_OBJECTIVE text="Confirm the device returns online after power cycling."
2026-04-21 12:00:40,155:[INFO ][runner ] MI: ITERATION_START name=power_cycle_recovery tin=0
2026-04-21 12:00:40,156:[INFO ][runner ] MI: ITERATION_PARAM key=cycle value=1
2026-04-21 12:00:40,157:[INFO ][runner ] MI: ITERATION_OBJECTIVE text="Execute the first power-cycle recovery pass."
2026-04-21 12:00:40,158:[INFO ][runner ] MI: STEP_PUSH text="Power cycle rig"
2026-04-21 12:00:40,159:[INFO ][powerctl ] Powering the rig off
2026-04-21 12:00:40,500:[WARN ][powerctl ] PCIe link lost as expected
2026-04-21 12:00:41,000:[INFO ][powerctl ] Powering the rig on
2026-04-21 12:00:41,001:[INFO ][runner ] MI: STEP_POP text="Power cycle rig"
2026-04-21 12:00:41,002:[INFO ][runner ] MI: STEP text="Wait for device enumeration"
2026-04-21 12:00:41,003:[INFO ][nvmecli ] nvme list shows /dev/nvme0n1
2026-04-21 12:00:41,003:[INFO ][dmesg ] nvme nvme0: 8/0/0 default/read/poll queues
2026-04-21 12:00:41,004:[WARN ][watchdog ] Recovery watchdog terminated the validation flow after timeout
2026-04-21 12:00:41,005:[INFO ][runner ] MI: RESULT status=KILLED expected=KILLED
2026-04-21 12:00:41,006:[WARN ][runner ] MI: VERDICT text="Watchdog kill was expected for this negative case"
2026-04-21 12:00:41,007:[INFO ][runner ] MI: ITERATION_END name=power_cycle_recovery tin=0 status=KILLED
2026-04-21 12:00:41,006:[INFO ][runner ] MI: ITERATION_START name=power_cycle_recovery tin=1
2026-04-21 12:00:41,007:[INFO ][runner ] MI: ITERATION_PARAM key=cycle value=2
2026-04-21 12:00:41,008:[INFO ][runner ] MI: ITERATION_OBJECTIVE text="Repeat the power-cycle recovery pass."
2026-04-21 12:00:41,009:[INFO ][runner ] MI: STEP_PUSH text="Power cycle rig"
2026-04-21 12:00:41,010:[INFO ][powerctl ] Powering the rig off
2026-04-21 12:00:41,400:[WARN ][powerctl ] Link training reset in progress
2026-04-21 12:00:42,000:[INFO ][powerctl ] Powering the rig on
2026-04-21 12:00:42,001:[INFO ][runner ] MI: STEP_POP text="Power cycle rig"
2026-04-21 12:00:42,002:[INFO ][runner ] MI: STEP text="Wait for device enumeration"
2026-04-21 12:00:42,003:[INFO ][nvmecli ] nvme list shows /dev/nvme0n1
2026-04-21 12:00:42,003:[INFO ][dmesg ] nvme nvme0: Shutdown timeout set to 8 seconds
2026-04-21 12:00:42,004:[ERROR ][watchdog ] Recovery helper dumped core while validating namespaces
2026-04-21 12:00:42,005:[INFO ][runner ] MI: RESULT status=CORED expected=PASSED
2026-04-21 12:00:42,006:[ERROR ][runner ] MI: VERDICT text="Recovery helper crashed unexpectedly"
2026-04-21 12:00:42,007:[INFO ][runner ] MI: ITERATION_END name=power_cycle_recovery tin=1 status=CORED
2026-04-21 12:00:42,008:[INFO ][runner ] MI: TEST_END name=power_cycle_recovery status=FAILED
2026-04-21 12:00:42,007:[INFO ][runner ] MI: PACKAGE_END name=reliability
2026-04-21 12:00:42,010:[INFO ][runner ] MI: PACKAGE_END name=storage
2026-04-21 12:00:42,020:[INFO ][runner ] MI: RUN_END name=example-ci
- Reference converter:
example_converter.py - Example bundle generated ready for import
example-bundle.tar.gz
The attached raw log and converter show one recommended approach for:
- one run-level prologue represented as an ordinary child test under the root;
- one main parent package with three subpackages;
- logical tests and iterations;
- event-based MI records with no multiline machine-readable blocks;
- derived UI routing for
entity_nameanduser_name.
Note that you can take your own approach as long as the resulting JSON and file
structure comply with Bublik requirements. We recommend reserving MI: lines
for machine-readable data that the converter maps into bublik.json,
meta_data.json, and json/node_*.json.
Conventions (what the converter should rely on)
- Timestamped message lines:
YYYY-MM-DD HH:MM:SS,mmm:[LEVEL][ENTITY] message... - Machine-readable prefix: every structured line that should affect the generated bundle starts with
MI:. - Single-line events: each machine-readable record is one line in the form
MI: <EVENT> key=value .... - Quoted values: values with spaces use double quotes.
- No multiline MI blocks: indentation is never part of the machine-readable contract.
- Explicit lifecycle markers:
MI: RUN_START .../MI: RUN_END ...MI: PACKAGE_START .../MI: PACKAGE_END ...MI: TEST_START .../MI: TEST_END ...MI: ITERATION_START .../MI: ITERATION_END ...
- Dedicated semantic events:
MI: RUN_META ...formeta_data.jsoninputs.MI: RUN_TAG ...for top-levelbublik.json.tags.MI: *_PARAM ...for nodeparams.MI: *_OBJECTIVE ...for nodeobjective.MI: RESULT ...,MI: VERDICT ...,MI: ARTIFACT ...,MI: MEASUREMENT ...for iteration or prologue outputs.
- Scenario-friendly steps: emit
MI: STEP ...,MI: STEP_PUSH ..., andMI: STEP_POP ...so the converter can derive scenario rows for the UI. - Human text stays separate: non-
MI:lines can still be logged for traceability; the converter treats them as plain text rows, not as structure.
This page defines a recommended raw-log structure.
The actual conversion step is responsible for mapping this structure into
Bublik’s import bundle format.
Example hierarchy
The example assets in this directory use this fixed structure:
example-ci
├── prologue
└── storage
├── identify
│ └── identify_basic
│ ├── tin=0
│ └── tin=1
├── io
│ ├── throughput_rw
│ │ ├── tin=0
│ │ └── tin=1
│ └── latency_randread
│ ├── tin=0
│ └── tin=1
└── reliability
└── power_cycle_recovery
├── tin=0
└── tin=1
Recommended mapping from raw logs
MI: FORMAT_VERSION value=2declares the event contract version.MI: RUN_META key=<name> value=<value>feedsmeta_data.json; the converter may add derived metas such asFINISH_TIMESTAMP,RUN_STATUS, andRUN_OK.MI: RUN_TAG key=<name> value=<value>feeds top-levelbublik.json.tags.MI: TEST_START name=prologueat the run root populates an ordinary root childtestnode namedprologuebefore package tests.MI: PACKAGE_STARTcreates apkgnode inbublik.jsonand pushes it onto the current hierarchy stack.- Nested packages become nested
pkgnodes in bothplananditers. MI: TEST_STARTidentifies the logical test under the current package path.MI: ITERATION_STARTidentifies one executable leaftestnode under that logical test.- If one logical test has multiple iterations, prefer a parent grouping node for the logical test and one leaf
testnode per iteration. MI: PACKAGE_PARAM,MI: TEST_PARAM, andMI: ITERATION_PARAMmap to the matching nodeparams.MI: RUN_OBJECTIVE,MI: TEST_OBJECTIVE,MI: PACKAGE_OBJECTIVE, andMI: ITERATION_OBJECTIVEmap to the matching nodeobjective.MI: RESULT,MI: VERDICT,MI: ARTIFACT, andMI: MEASUREMENTpopulate node result data and UI rows without parsing free text.- Raw logs do not carry
entity_nameoruser_name; the converter derives those from event type and scope when buildingjson/node_*.json.
What Bublik needs to import (bundle requirements)
Bublik imports a bundle directory available over HTTP.
Bundle layout (example)
${BUBLIK_DOCKER_DATA_DIR}/logs/logs/.../bundle-dir
|-- bublik.json
|-- meta_data.json
|-- json
| |-- tree.json
| |-- node_1_0.json
| |-- node_id1.json
| |-- node_id2.json
| |-- ...
| `-- node_id{N}.json
`-- {source}.log
bublik.json
- Purpose: main run import file — execution plan, iteration tree, package/test nodes, timestamps, obtained and expected results, verdicts, errors, artifacts, measurements, tags, and display paths.
- Database import: required.
- Log UI: required indirectly (drives node JSON generation).
- Data Contract:
bublik.jsonData Contract - Details: see
bublik.json.
meta_data.json
- Purpose: run metadata — test suite, configuration, device, start/finish timestamps, project, run status, optional extra metas.
- Database import: required.
- Log UI: used for run identity and filters.
- Data Contract:
meta_data.jsonData Contract - Details: see
meta_data.json.
json/tree.json
- Purpose: navigation index — maps node JSON filenames to a tree structure for the log UI (
main_packageplus per-file entries and optionalchildren). - Database import: not required.
- Log UI: required for navigation as produced by this bundle format.
- Data Contract:
UI Log JSONData Contract - Details: see UI log JSON.
json/node_1_0.json
- Purpose: root package log-viewer JSON for the full run.
- Database import: not required.
- Log UI: required for the full run log view.
- Data Contract:
UI Log JSONData Contract - Details: see UI log JSON.
json/node_id1.json
- Purpose: same content as
node_1_0.json— compatibility with UI/proxy paths that address the root node by test id (test_id1). - Database import: not required.
- Log UI: recommended.
- Data Contract:
UI Log JSONData Contract - Details: see UI log JSON.
json/node_id{N}.json
- Purpose: per-iteration log pages for packages and tests.
- Database import: not required.
- Log UI: required for individual package/test log pages.
- Data Contract:
UI Log JSONData Contract - Details: see UI log JSON.
{source}.log
- Purpose: copy of the original input for traceability and parser debugging.
- Database import: not used directly.
- Log UI: optional (not loaded as structured log JSON).
- Data Contract: none — auxiliary source copy, not part of the importer/UI JSON contract.
Summary: database import needs bublik.json and meta_data.json. Opening logs in the UI needs the json/ directory.
Import flow (diagram)
Step-by-step import
- Convert raw log → bundle directory
- Produce the bundle files listed above.
- Example:
python3 example_converter.py \
example_raw.log \
-o /tmp/example-bundle \
--pretty
The script writes:
bublik.jsonmeta_data.jsonjson/tree.jsonjson/node_1_0.jsonjson/node_id1.jsonjson/node_id<N>.json- a copy of the source log
- Transfer bundle directory to the Bublik host
- If you generated the bundle on a different machine, copy the whole bundle directory to the host where Bublik is running.
- Example:
scp -r /path/to/bundle-dir user@<bublik_host>:/tmp/bundle-dir
- Publish the bundle directory
- Place the bundle directory anywhere under
${BUBLIK_DOCKER_DATA_DIR}/logs/logs/(you can add any nesting and use any folder names). - Confirm it is accessible as a directory URL under
http://<bublik_host>/logs/.../(you should seemeta_data.json,bublik.json, andjson/). - Example on the Bublik host:
- Place the bundle directory anywhere under
mkdir -p ${BUBLIK_DOCKER_DATA_DIR}/logs/logs/example
cp -R /tmp/example-bundle ${BUBLIK_DOCKER_DATA_DIR}/logs/logs/example/
- Import into Bublik
curl 'http://<bublik_host>/api/v2/importruns/source/?url=http://<bublik_host>/logs/example/example-bundle&force=true'
Quick checklist
meta_data.jsonhasPROJECT,RUN_STATUS, and stable run key metas (typicallySTART_TIMESTAMP+CFG).- Raw logs use single-line
MI:events with explicit run/prologue/package/test/iteration lifecycle markers. - Package-, test-, iteration-, and prologue-scoped parameters are logged separately and mapped to the correct node.
- Every test iteration has a deterministic name/path and a single final status (
PASSED/FAILED/INCOMPLETE/...). - Measurements appear under the same test node they were produced by (not at run level), otherwise charts may not show up where expected.
- Raw logs contain enough structure for the converter to derive the main test entity and scenario rows for
#Scenario/#Test.