code: def test_log_metrics(self):
      metrics = {"a": 1.0, "x": {"y": 2.0}}
      self.mlflow_util.setup_mlflow(
          tracking_uri=self.tracking_uri,
          experiment_name="new_experiment",
      )
      run = self.mlflow_util.start_run()
      run_id = run.info.run_id
      self.mlflow_util.log_metrics(
          metrics_to_log=metrics, run_id=run_id, step=0
      )
  
      run = self.mlflow_util._mlflow.get_run(run_id=run_id)
      assert run.data.metrics == flatten_dict(metrics)
  
      metrics2 = {"b": 1.0}
      self.mlflow_util.start_run(set_active=True)
      self.mlflow_util.log_metrics(
          metrics_to_log=metrics2, run_id=run_id, step=0
      )
      assert self.mlflow_util._mlflow.get_run(
          run_id=run_id
      ).data.metrics == flatten_dict(
          {
              **metrics,
              **metrics2,
          }
      )
      self.mlflow_util.end_run()
  
imports: import os
  import shutil
  import tempfile
  import unittest
  from collections import namedtuple
  from unittest.mock import patch
  from mlflow.tracking import MlflowClient
  from ray._private.dict import flatten_dict
  from ray.train._internal.session import init_session, shutdown_session
  from ray.train._internal.storage import StorageContext
  from ray.air.integrations.mlflow import MLflowLoggerCallback, setup_mlflow, _NoopModule
  from ray.air._internal.mlflow import _MLflowLoggerUtil
label_desc: Use image node_id 12 for calling the MLflowUtilTest obj's underlying member method code with example usage: obj.test_log_metrics() without return types