{
  "version": 10,
  "plumr_config": {
    "pipeline": {
      "delay_constant-1": {
        "delay_constant": {
          "flows": [
            {
              "input": "[delay_constant-1-flows-0|in:0]-[loss_constant-1-flows-0|out:0]",
              "output": "[peer_writer-1|in:0]-[delay_constant-1-flows-0|out:0]"
            },
            {
              "input": "[delay_constant-1-flows-1|in:1]-[udp_remote-1|out:0]",
              "output": "[loss_constant-1-flows-1|in:1]-[delay_constant-1-flows-1|out:1]"
            },
            {
              "input": "[delay_constant-1-flows-2|in:2]-[loss_constant-1-flows-2|out:2]",
              "output": "[raft-5-carriers-0|in:0]-[delay_constant-1-flows-2|out:2]"
            },
            {
              "input": "[delay_constant-1-flows-3|in:3]-[raft-5-carriers-0|out:0]",
              "output": "[loss_constant-1-flows-3|in:3]-[delay_constant-1-flows-3|out:3]"
            }
          ],
          "delay": 100,
          "jitter": 0
        }
      },
      "loss_constant-1": {
        "loss_constant": {
          "flows": [
            {
              "input": "[loss_constant-1-flows-0|in:0]-[peer_router-1-ingress|out:0]",
              "output": "[delay_constant-1-flows-0|in:0]-[loss_constant-1-flows-0|out:0]"
            },
            {
              "input": "[loss_constant-1-flows-1|in:1]-[delay_constant-1-flows-1|out:1]",
              "output": "[peer_router-1-egress|in:0]-[loss_constant-1-flows-1|out:1]"
            },
            {
              "input": "[loss_constant-1-flows-2|in:2]-[raft-2-carriers-0|out:0]",
              "output": "[delay_constant-1-flows-2|in:2]-[loss_constant-1-flows-2|out:2]"
            },
            {
              "input": "[loss_constant-1-flows-3|in:3]-[delay_constant-1-flows-3|out:3]",
              "output": "[raft-2-carriers-0|in:0]-[loss_constant-1-flows-3|out:3]"
            }
          ],
          "loss_probability": 2
        }
      },
      "peer_router-1": {
        "peer_router": {
          "ingress": {
            "input": "[peer_router-1-ingress|in:0]-[udp_local-1|out:0]",
            "output": "[loss_constant-1-flows-0|in:0]-[peer_router-1-ingress|out:0]"
          },
          "egress": {
            "input": "[peer_router-1-egress|in:0]-[loss_constant-1-flows-1|out:1]",
            "output": "[udp_local-1|in:0]-[peer_router-1-egress|out:0]"
          }
        }
      },
      "peer_router-2": {
        "peer_router": {
          "ingress": {
            "input": "[peer_router-2-ingress|in:0]-[udp_local-2|out:0]",
            "output": "[raft-2-streams-0|in:0]-[peer_router-2-ingress|out:0]"
          },
          "egress": {
            "input": "[peer_router-2-egress|in:0]-[raft-2-streams-0|out:0]",
            "output": "[udp_local-2|in:0]-[peer_router-2-egress|out:0]"
          }
        }
      },
      "udp_local-1": {
        "udp_local": {
          "input": "[udp_local-1|in:0]-[peer_router-1-egress|out:0]",
          "output": "[peer_router-1-ingress|in:0]-[udp_local-1|out:0]",
          "address": "127.0.0.1:5001"
        }
      },
      "udp_local-2": {
        "udp_local": {
          "input": "[udp_local-2|in:0]-[peer_router-2-egress|out:0]",
          "output": "[peer_router-2-ingress|in:0]-[udp_local-2|out:0]",
          "address": "127.0.0.1:5000"
        }
      },
      "udp_remote-1": {
        "udp_remote": {
          "input": "[udp_remote-1|in:0]-[peer_writer-1|out:0]",
          "output": "[delay_constant-1-flows-1|in:1]-[udp_remote-1|out:0]"
        }
      },
      "delay_constant-2": {
        "delay_constant": {
          "flows": [
            {
              "input": "[delay_constant-2-flows-0|in:0]-[loss_constant-2-flows-0|out:0]",
              "output": "[raft-5-carriers-1|in:1]-[delay_constant-2-flows-0|out:0]"
            },
            {
              "input": "[delay_constant-2-flows-1|in:1]-[raft-5-carriers-1|out:1]",
              "output": "[loss_constant-2-flows-1|in:1]-[delay_constant-2-flows-1|out:1]"
            }
          ],
          "delay": 100,
          "jitter": 5
        }
      },
      "loss_constant-2": {
        "loss_constant": {
          "flows": [
            {
              "input": "[loss_constant-2-flows-0|in:0]-[raft-2-carriers-1|out:1]",
              "output": "[delay_constant-2-flows-0|in:0]-[loss_constant-2-flows-0|out:0]"
            },
            {
              "input": "[loss_constant-2-flows-1|in:1]-[delay_constant-2-flows-1|out:1]",
              "output": "[raft-2-carriers-1|in:1]-[loss_constant-2-flows-1|out:1]"
            }
          ],
          "loss_probability": 2
        }
      },
      "peer_writer-1": {
        "peer_writer": {
          "input": "[peer_writer-1|in:0]-[delay_constant-1-flows-0|out:0]",
          "output": "[udp_remote-1|in:0]-[peer_writer-1|out:0]",
          "remote_address": "127.0.0.1:6001"
        }
      },
      "peer_writer-2": {
        "peer_writer": {
          "input": "[peer_writer-2|in:0]-[raft-5-streams-0|out:0]",
          "output": "[udp_remote-2|in:0]-[peer_writer-2|out:0]",
          "remote_address": "127.0.0.1:6000"
        }
      },
      "raft-2": {
        "raft": {
          "streams": [
            {
              "input": "[raft-2-streams-0|in:0]-[peer_router-2-ingress|out:0]",
              "output": "[peer_router-2-egress|in:0]-[raft-2-streams-0|out:0]",
              "stream_handle": 0,
              "realtime_stream": {
                "timeout": 500,
                "delivery_policy": "ON_ORDERED",
                "extension": null
              }
            }
          ],
          "carriers": [
            {
              "input": "[raft-2-carriers-0|in:0]-[loss_constant-1-flows-3|out:3]",
              "output": "[loss_constant-1-flows-2|in:2]-[raft-2-carriers-0|out:0]",
              "carrier_handle": 0
            },
            {
              "input": "[raft-2-carriers-1|in:1]-[loss_constant-2-flows-1|out:1]",
              "output": "[loss_constant-2-flows-0|in:0]-[raft-2-carriers-1|out:1]",
              "carrier_handle": 1
            }
          ],
          "max_packet_bytes": 1500
        }
      },
      "raft-5": {
        "raft": {
          "streams": [
            {
              "input": "[raft-5-streams-0|in:0]-[udp_remote-2|out:0]",
              "output": "[peer_writer-2|in:0]-[raft-5-streams-0|out:0]",
              "stream_handle": 0,
              "realtime_stream": {
                "timeout": 500,
                "delivery_policy": "ON_ORDERED",
                "extension": null
              }
            }
          ],
          "carriers": [
            {
              "input": "[raft-5-carriers-0|in:0]-[delay_constant-1-flows-2|out:2]",
              "output": "[delay_constant-1-flows-3|in:3]-[raft-5-carriers-0|out:0]",
              "carrier_handle": 0
            },
            {
              "input": "[raft-5-carriers-1|in:1]-[delay_constant-2-flows-0|out:0]",
              "output": "[delay_constant-2-flows-1|in:1]-[raft-5-carriers-1|out:1]",
              "carrier_handle": 1
            }
          ],
          "max_packet_bytes": 1500
        }
      },
      "udp_remote-2": {
        "udp_remote": {
          "input": "[udp_remote-2|in:0]-[peer_writer-2|out:0]",
          "output": "[raft-5-streams-0|in:0]-[udp_remote-2|out:0]"
        }
      }
    },
    "shm_config": null,
    "log_filters": [],
    "lifecycle_handler": {
      "env": null,
      "on_setup": [],
      "pre_start": [
        {
          "cmd": "/opt/homebrew/bin/gst-launch-1.0 avfvideosrc device-index=0 ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! x264enc speed-preset=ultrafast tune=zerolatency bitrate=10000 ! h264parse ! rtph264pay config-interval=1 pt=96 mtu=500 ! multiudpsink clients=127.0.0.1:5000,127.0.0.1:5001",
          "policy": "RUN_IN_BACKGROUND",
          "env": null
        },
        {
          "cmd": "/opt/homebrew/bin/gst-launch-1.0 udpsrc port=6000 caps=\"application/x-rtp, media=video, encoding-name=H264, payload=96\" ! rtph264depay ! avdec_h264 ! videoconvert ! textoverlay text=\"NanoPing\" valignment=top halignment=center font-desc=\"Sans, 36\" ! autovideosink",
          "policy": "RUN_IN_BACKGROUND",
          "env": null
        },
        {
          "cmd": "/opt/homebrew/bin/gst-launch-1.0 udpsrc port=6001 caps=\"application/x-rtp, media=video, encoding-name=H264, payload=96\" ! rtph264depay ! avdec_h264 ! videoconvert ! textoverlay text=\"UDP\" valignment=top halignment=center font-desc=\"Sans, 36\" ! autovideosink",
          "policy": "RUN_IN_BACKGROUND",
          "env": null
        }
      ],
      "post_start": [],
      "pre_stop": [],
      "post_stop": []
    }
  },
  "meta": {
    "component_display_coordinates": {
      "raft-2": {
        "x": 440,
        "y": 360
      },
      "udp_remote-1": {
        "x": 1160,
        "y": 160
      },
      "udp_remote-2": {
        "x": 1760,
        "y": 720
      },
      "delay_constant-1": {
        "x": 960,
        "y": 360
      },
      "loss_constant-1": {
        "x": 720,
        "y": 440
      },
      "peer_router-2": {
        "x": 240,
        "y": 640
      },
      "raft-5": {
        "x": 1200,
        "y": 400
      },
      "udp_local-1": {
        "x": 560,
        "y": 80
      },
      "udp_local-2": {
        "x": -40,
        "y": 640
      },
      "delay_constant-2": {
        "x": 960,
        "y": 800
      },
      "loss_constant-2": {
        "x": 720,
        "y": 840
      },
      "peer_router-1": {
        "x": 800,
        "y": 80
      },
      "peer_writer-1": {
        "x": 960,
        "y": 80
      },
      "peer_writer-2": {
        "x": 1520,
        "y": 560
      }
    },
    "component_display_order": {
      "loss_constant-2": 9,
      "peer_writer-2": 3,
      "raft-2": 11,
      "raft-5": 10,
      "udp_local-1": 2,
      "udp_remote-1": 0,
      "delay_constant-1": 12,
      "peer_router-1": 5,
      "peer_router-2": 7,
      "peer_writer-1": 4,
      "udp_local-2": 6,
      "udp_remote-2": 1,
      "delay_constant-2": 8,
      "loss_constant-1": 13
    }
  },
  "kpis": {
    "variables": {
      "source_carrier0_latency": "/pipeline/raft-2/raft_node/raft_carrier:0/raft_latency_estimator/link_trip_time",
      "source_carrier1_bw_out": "/pipeline/raft-2/raft_node/raft_carrier:1/bandwidth_out",
      "source_flow0_overall_repair_mode": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/raft_realtime_flow:0/overall_repair_mode",
      "sink_stream_control": "/pipeline/raft-5/raft_node/stream_control",
      "sink_carrier0_bw_in": "/pipeline/raft-5/raft_node/raft_carrier:0/bandwidth_in",
      "sink_carrier1_bw_in": "/pipeline/raft-5/raft_node/raft_carrier:1/bandwidth_in",
      "sink_stream_bw_in": "/pipeline/raft-5/raft_node/raft_realtime_stream:0/bandwidth_in",
      "source_carrier1_latency": "/pipeline/raft-2/raft_node/raft_carrier:1/raft_latency_estimator/link_trip_time",
      "source_flow1_overall_viability": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/raft_realtime_flow:1/overall_viability",
      "source_stream_bw_out": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/bandwidth_out",
      "source_carrier0_bw_out": "/pipeline/raft-2/raft_node/raft_carrier:0/bandwidth_out",
      "source_flow0_overall_viability": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/raft_realtime_flow:0/overall_viability",
      "source_viability_control": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/viability_control",
      "sink_carrier0_stable_loss": "/pipeline/raft-5/raft_node/raft_carrier:0/raft_loss_tracker/stable_loss_rate",
      "sink_flow0_overall_viability": "/pipeline/raft-5/raft_node/raft_realtime_stream:0/raft_realtime_flow:0/overall_viability",
      "source_carrier0_bw_in": "/pipeline/raft-2/raft_node/raft_carrier:0/bandwidth_in",
      "source_carrier0_stable_loss": "/pipeline/raft-2/raft_node/raft_carrier:0/raft_loss_tracker/stable_loss_rate",
      "source_carrier1_bw_in": "/pipeline/raft-2/raft_node/raft_carrier:1/bandwidth_in",
      "source_flow1_overall_repair_mode": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/raft_realtime_flow:1/overall_repair_mode",
      "sink_carrier1_bw_out": "/pipeline/raft-5/raft_node/raft_carrier:1/bandwidth_out",
      "sink_flow0_overall_repair_mode": "/pipeline/raft-5/raft_node/raft_realtime_stream:0/raft_realtime_flow:0/overall_repair_mode",
      "sink_stream_bw_out": "/pipeline/raft-5/raft_node/raft_realtime_stream:0/bandwidth_out",
      "source_carrier1_stable_loss": "/pipeline/raft-2/raft_node/raft_carrier:1/raft_loss_tracker/stable_loss_rate",
      "source_stream_bw_in": "/pipeline/raft-2/raft_node/raft_realtime_stream:0/bandwidth_in",
      "sink_carrier1_stable_loss": "/pipeline/raft-5/raft_node/raft_carrier:1/raft_loss_tracker/stable_loss_rate",
      "sink_loss_stream": "/pipeline/raft-5/raft_node/raft_realtime_stream:0/raft_loss_tracker/stable_loss_rate",
      "sink_viability_control": "/pipeline/raft-5/raft_node/raft_realtime_stream:0/viability_control",
      "sink_flow1_overall_viability": "/pipeline/raft-5/raft_node/raft_realtime_stream:0/raft_realtime_flow:1/overall_viability",
      "source_stream_control": "/pipeline/raft-2/raft_node/stream_control",
      "sink_flow1_overall_repair_mode": "/pipeline/raft-5/raft_node/raft_realtime_stream:0/raft_realtime_flow:1/overall_repair_mode",
      "sink_carrier0_bw_out": "/pipeline/raft-5/raft_node/raft_carrier:0/bandwidth_out",
      "sink_total_lost": "/pipeline/raft-5/raft_node/raft_realtime_stream:0/raft_loss_tracker/total_lost"
    },
    "metrics": [
      {
        "label": "Source",
        "description": "",
        "id": "1"
      },
      {
        "label": "Reliability",
        "gauge": {
          "expression": "sink_loss_stream"
        },
        "description": "sink_loss_stream",
        "id": "mkmd7q03",
        "column_span": 2
      },
      {
        "label": "Loss carrier0 (source)",
        "gauge": {
          "expression": "source_carrier0_stable_loss"
        },
        "description": "",
        "id": "8"
      },
      {
        "label": "Loss carrier1 (source)",
        "gauge": {
          "expression": "source_carrier1_stable_loss"
        },
        "description": "",
        "id": "9"
      },
      {
        "label": "Latency carrier0",
        "value_over_time": {
          "expression": "source_carrier0_latency",
          "unit": "ms"
        },
        "description": "",
        "id": "10"
      },
      {
        "label": "Latency carrier1",
        "value_over_time": {
          "expression": "source_carrier1_latency",
          "unit": "ms"
        },
        "description": "",
        "id": "11"
      },
      {
        "label": "Stream Bandwidth (in)",
        "value_over_time": {
          "expression": "source_stream_bw_in",
          "unit": "B/s"
        },
        "description": "",
        "id": "16"
      },
      {
        "label": "Carrier0 Bandwidth",
        "value_over_time": {
          "expression": "source_carrier0_bw_out",
          "unit": "B/s"
        },
        "description": "",
        "id": "17"
      },
      {
        "label": "Carrier1 Bandwidth",
        "value_over_time": {
          "expression": "source_carrier1_bw_out",
          "unit": "B/s"
        },
        "description": "",
        "id": "18"
      },
      {
        "label": "Sink",
        "description": "",
        "id": "19"
      },
      {
        "label": "Data Rate Rx",
        "data_rate": {
          "goodput_expression": "sink_stream_bw_out",
          "overhead_expression": "(sink_carrier0_bw_in + sink_carrier1_bw_in) - sink_stream_bw_out",
          "type": "RATE"
        },
        "description": "Represents the reception data rate, including goodput and overhead.",
        "id": "20"
      },
      {
        "label": "Data Rate Tx",
        "data_rate": {
          "goodput_expression": "sink_stream_bw_in",
          "overhead_expression": "(sink_carrier0_bw_out + sink_carrier1_bw_out) - sink_stream_bw_in",
          "type": "RATE"
        },
        "description": "Represents the reception data rate, including goodput and overhead.",
        "id": "21"
      },
      {
        "label": "Data Overhead Rx",
        "gauge": {
          "expression": "(1.0 - (sink_stream_bw_out / (sink_carrier0_bw_in + sink_carrier1_bw_in))) * 100"
        },
        "description": "Represents the reception overhead percentage, calculated as the proportion of non-goodput data in the total received data.",
        "id": "22"
      },
      {
        "label": "Data Overhead Tx",
        "gauge": {
          "expression": "(1.0 - (sink_stream_bw_in / (sink_carrier0_bw_out + sink_carrier0_bw_out))) * 100"
        },
        "description": "Represents the reception overhead percentage, calculated as the proportion of non-goodput data in the total received data.",
        "id": "23"
      },
      {
        "label": "Sink total lost",
        "value": {
          "expression": "sink_total_lost",
          "unit": ""
        },
        "description": "",
        "id": "25"
      },
      {
        "label": "Loss carrier0 (sink)",
        "gauge": {
          "expression": "sink_carrier0_stable_loss"
        },
        "description": "",
        "id": "26"
      },
      {
        "label": "Loss carrier1 (sink)",
        "gauge": {
          "expression": "sink_carrier1_stable_loss"
        },
        "description": "",
        "id": "27"
      },
      {
        "label": "Sink -> Stream Control",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "sink_stream_control == 0",
              "text": "local",
              "color": "orange"
            },
            {
              "expression": "sink_stream_control == 1",
              "text": "remote",
              "color": "yellow"
            }
          ]
        },
        "description": "",
        "id": "m36ejzfr"
      },
      {
        "label": "Sink -> Viability Control",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "sink_viability_control == 0",
              "text": "undetermined",
              "color": "red"
            },
            {
              "expression": "sink_viability_control == 1",
              "text": "local",
              "color": "orange"
            },
            {
              "expression": "sink_viability_control == 2",
              "text": "remote",
              "color": "yellow"
            }
          ]
        },
        "description": "",
        "id": "m36en5uj"
      },
      {
        "label": "Sink Flow0 (repair mode)",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "sink_flow0_overall_repair_mode == 0",
              "text": "off",
              "color": "red"
            },
            {
              "expression": "sink_flow0_overall_repair_mode == 1",
              "text": "backup",
              "color": "orange"
            },
            {
              "expression": "sink_flow0_overall_repair_mode == 2",
              "text": "instant",
              "color": "yellow"
            },
            {
              "expression": "sink_flow0_overall_repair_mode == 3",
              "text": "proactive",
              "color": "green"
            },
            {
              "expression": "sink_flow0_overall_repair_mode == 4",
              "text": "reactive",
              "color": "green"
            }
          ]
        },
        "description": "",
        "id": "28"
      },
      {
        "label": "Sink Flow1 (repair mode)",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "sink_flow1_overall_repair_mode == 0",
              "text": "off",
              "color": "red"
            },
            {
              "expression": "sink_flow1_overall_repair_mode == 1",
              "text": "backup",
              "color": "orange"
            },
            {
              "expression": "sink_flow1_overall_repair_mode == 2",
              "text": "instant",
              "color": "yellow"
            },
            {
              "expression": "sink_flow1_overall_repair_mode == 3",
              "text": "proactive",
              "color": "green"
            },
            {
              "expression": "sink_flow1_overall_repair_mode == 4",
              "text": "reactive",
              "color": "green"
            }
          ]
        },
        "description": "",
        "id": "29"
      },
      {
        "label": "Sink -> Flow0",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "sink_flow0_overall_viability == 0",
              "text": "disabled",
              "color": "red"
            },
            {
              "expression": "sink_flow0_overall_viability == 1",
              "text": "pending",
              "color": "orange"
            },
            {
              "expression": "sink_flow0_overall_viability == 2",
              "text": "viable",
              "color": "green"
            },
            {
              "expression": "sink_flow0_overall_viability == 3",
              "text": "prospect",
              "color": "yellow"
            },
            {
              "expression": "sink_flow0_overall_viability == 4",
              "text": "non_viable",
              "color": "red"
            }
          ]
        },
        "description": "",
        "id": "30"
      },
      {
        "label": "Sink -> Flow1",
        "value_to_text_conditions": {
          "conditions": [
            {
              "expression": "sink_flow1_overall_viability == 0",
              "text": "disabled",
              "color": "red"
            },
            {
              "expression": "sink_flow1_overall_viability == 1",
              "text": "pending",
              "color": "orange"
            },
            {
              "expression": "sink_flow1_overall_viability == 2",
              "text": "viable",
              "color": "green"
            },
            {
              "expression": "sink_flow1_overall_viability == 3",
              "text": "prospect",
              "color": "yellow"
            },
            {
              "expression": "sink_flow1_overall_viability == 4",
              "text": "non_viable",
              "color": "red"
            }
          ]
        },
        "description": "",
        "id": "31"
      }
    ]
  },
  "variables": [
    {
      "id": "carrier0_delay",
      "label": "Carrier 0: Delay (ms)",
      "description": "Time emulation need to hold back packets",
      "paths": [
        "plumr_config.pipeline.delay_constant-1.delay_constant.delay"
      ]
    },
    {
      "id": "carrier1_delay",
      "label": "Carrier 1: Delay (ms)",
      "description": "Time emulation need to hold back packets",
      "paths": [
        "plumr_config.pipeline.delay_constant-2.delay_constant.delay"
      ]
    },
    {
      "id": "carrier0_jitter",
      "label": "Carrier 0: Jitter (ms)",
      "description": "Time varience in how long packets are delayed",
      "paths": [
        "plumr_config.pipeline.delay_constant-1.delay_constant.jitter"
      ]
    },
    {
      "id": "carrier1_jitter",
      "label": "Carrier 1: Jitter (ms)",
      "description": "Time varience in how long packets are delayed",
      "paths": [
        "plumr_config.pipeline.delay_constant-1.delay_constant.jitter"
      ]
    },
    {
      "id": "m21wx11z",
      "label": "Stream Timeout",
      "description": "Timeout for the stream in milliseconds.",
      "paths": [
        "plumr_config.pipeline.raft-2.raft.streams[0].realtime_stream.timeout",
        "plumr_config.pipeline.raft-5.raft.streams[0].realtime_stream.timeout"
      ]
    },
    {
      "id": "m2284787",
      "label": "Carrier0 loss (%)",
      "description": "Probability of packet loss, ranging from 0.0 to 100.",
      "paths": [
        "plumr_config.pipeline.loss_constant-1.loss_constant.loss_probability"
      ]
    },
    {
      "id": "m2284st8",
      "label": "Carrier1 loss (%)",
      "description": "Probability of packet loss, ranging from 0.0 to 100.",
      "paths": [
        "plumr_config.pipeline.loss_constant-2.loss_constant.loss_probability"
      ]
    }
  ]
}