@VisibleForTesting
  public String getLullMessage(Thread trackedThread, Duration millis) {
    // TODO(ajamato): Share getLullMessage code with DataflowExecutionState.
    String userStepName =
        this.labelsMetadata.getOrDefault(MonitoringInfoConstants.Labels.PTRANSFORM, null);
    StringBuilder message = new StringBuilder();
    message.append("Operation ongoing");
    if (userStepName != null) {
      message.append(" in step ").append(userStepName);
    }
    message
        .append(" for at least ")
        .append(formatDuration(millis))
        .append(" without outputting or completing in state ")
        .append(getStateName());
    message.append("\n");

    StackTraceElement[] fullTrace = trackedThread.getStackTrace();
    for (StackTraceElement e : fullTrace) {
      message.append("  at ").append(e).append("\n");
    }
    return message.toString();
  }
@Test
  public void testGetLullReturnsARelevantMessageWithoutStepNameWithNullLabels() {
    SimpleExecutionState testObject = new SimpleExecutionState("myState", null, null);
    String message = testObject.getLullMessage(new Thread(), Duration.millis(100_000));
    assertThat(message, containsString("myState"));
  }