Why alloy wraps my log and all the metadata to json?

Hello, i’m trying to setup to collect my logs through following stack:
javaApp → otelJavaAgent → alloy → loki.

I tried two approaches within alloy:

  1. otelcol.receiver.otlp → otelcol.processor.batch → otelcol.exporter.loki → loki.write
    This approach for some reason wraps my log and my metadata into json, and saves this json into loki, while i want to have just a logline + labels + loki_structured_metadata
    the example of json is below:
    {
    “status”: “success”,
    “data”: {
    “resultType”: “streams”,
    “result”: [
    {
    “stream”: {
    “detected_level”: “INFO”,
    “exporter”: “OTLP”,
    “instance”: “01”,
    “job”: “dten/dten_4”,
    “level”: “INFO”,
    “service_name”: “dten/dten_4”
    },
    “values”: [
    [
    “1738827312100000000”,
    “{"body":"Hello, world2!","severity":"INFO","resources":{"host.arch":"aarch64","host.name":"Dmitriys-MBP","os.description":"Mac OS X 12.5.1","os.type":"darwin","process.command_args":["-junit4","otel.OtelTest"],"process.executable.path":"/opt/homebrew/Cellar/openjdk/21.0.2/libexec/openjdk.jdk/Contents/Home/bin/java","process.pid":35012,"process.runtime.description":"Homebrew OpenJDK 64-Bit Server VM 21.0.2","process.runtime.name":"OpenJDK Runtime Environment","process.runtime.version":"21.0.2","service.instance.id":"01","service.name":"dten_4","service.namespace":"dten","service.version":"1.2.3","telemetry.distro.name":"opentelemetry-java-instrumentation","telemetry.distro.version":"2.10.0","telemetry.sdk.language":"java","telemetry.sdk.name":"opentelemetry","telemetry.sdk.version":"1.44.1"},"instrumentation_scope":{"name":"otel.OtelTest"}}”
    ]

  2. The second approach is based on alloy graph:
    otelcol.receiver.otlp → otelcol.processor.batch → otelcol.exporter.otlphttp (through otlp protocol)
    the result seems to be fine, but this way i haven’t found how to specify labels, seems labels are only possible to create through approach 1 (and it does works)
    the json is below:
    {
    “status”: “success”,
    “data”: {
    “resultType”: “streams”,
    “result”: [
    {
    “stream”: {
    “detected_level”: “info”,
    “host_arch”: “aarch64”,
    “host_name”: “Dmitriys-MBP.fritz.box”,
    “observed_timestamp”: “1738841625863113000”,
    “os_description”: “Mac OS X 12.5.1”,
    “os_type”: “darwin”,
    “process_command_args”: “["otel.OtelTest"]”,
    “process_executable_path”: “/opt/homebrew/Cellar/openjdk/21.0.2/libexec/openjdk.jdk/Contents/Home/bin/java”,
    “process_pid”: “64415”,
    “process_runtime_description”: “Homebrew OpenJDK 64-Bit Server VM 21.0.2”,
    “process_runtime_name”: “OpenJDK Runtime Environment”,
    “process_runtime_version”: “21.0.2”,
    “scope_name”: “otel.OtelTest”,
    “service_instance_id”: “01”,
    “service_name”: “dten_5”,
    “service_namespace”: “dten”,
    “service_version”: “1.2.3”,
    “severity_number”: “9”,
    “severity_text”: “INFO”,
    “telemetry_distro_name”: “opentelemetry-java-instrumentation”,
    “telemetry_distro_version”: “2.10.0”,
    “telemetry_sdk_language”: “java”,
    “telemetry_sdk_name”: “opentelemetry”,
    “telemetry_sdk_version”: “1.44.1”
    },
    “values”: [
    [
    “1738841625863000000”,
    “Hello, world2!”
    ]

So all in all, my issues are that 1 - creates only labels without structured_metadata, all the metadata placed into logline. 2 - creates only structured_metadata, without labels.
Therefore questions are:
why otelcol.exporter.loki wraps my logs to json? Is it possible to avoid that?
OR
Is it possible to specify labels using approach 2?