2017-03-21 18 views
0

私のステートレスサービスのすべてのインスタンスに対して負荷を動的に報告しようとしています。目標は、後でコードから報告された値を読み取ることです。これまでのところ、いくつかの測定基準を報告し、FabricClientでそれらを読み取るコードがありますが、私が何をするにしても、私が得る数字は常に0です。メトリックをレポートコードPartition.ReportLoadによって報告されたマテックス値を取得できません。

<StatelessService ServiceTypeName="MySvcType" InstanceCount="-1"> 
    <SingletonPartition /> 
    <LoadMetrics> 
     <LoadMetric Name="MemoryInMb" /> 
     <LoadMetric Name="CPU" /> 
    </LoadMetrics> 
</StatelessService> 

- - だからここにサービスが設定されている方法です

protected override async Task RunAsync(CancellationToken cancellationToken) 
    { 
     await base.RunAsync(cancellationToken); 

     PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 
     PerformanceCounter ramCounter = new PerformanceCounter("Memory", "Available MBytes"); 

     while (true) 
     { 
      cancellationToken.ThrowIfCancellationRequested(); 

      this.Partition.ReportLoad(new List<LoadMetric> { new LoadMetric("MemoryInMb", (int)ramCounter.NextValue()), new LoadMetric("CPU", (int)cpuCounter.NextValue()) }); 

      await Task.Delay(5000); 
     } 
    } 

そして、ここで私は、これらの指標を引き出すために持っているコードです -

 var partitions = await fabricClient.QueryManager.GetPartitionListAsync(new Uri("fabric:/MyApp/MySvc")); 
     foreach (var partition in partitions) 
     { 
      var partitionLoad = await fabricClient.QueryManager.GetPartitionLoadInformationAsync(partition.PartitionInformation.Id); 

      var replicas = new List<Replica>(); 
      ServiceReplicaList replicaList = await fabricClient.QueryManager.GetReplicaListAsync(partition.PartitionInformation.Id); 
      replicas.AddRange(replicaList); 
      while (!string.IsNullOrEmpty(replicaList.ContinuationToken)) 
      { 
       replicaList = await fabricClient.QueryManager.GetReplicaListAsync(partition.PartitionInformation.Id, replicaList.ContinuationToken); 
       replicas.AddRange(replicaList); 
      } 

      foreach(var replica in replicas) 
      { 
       var replicaLoad = await fabricClient.QueryManager.GetReplicaLoadInformationAsync(partition.PartitionInformation.Id, replica.Id); 
       var memoryReports = replicaLoad.LoadMetricReports.Where(r => r.Name == "MemoryInMb"); 
       var cpuReports = replicaLoad.LoadMetricReports.Where(r => r.Name == "CPU"); 
      } 
     } 

だから私が定義したメトリックごとに1つのレポートしか返されず、値は常に0です。私のステートレスサービスで報告された値の取得を開始するにはどうすればよいですか?

答えて

1

ロードメトリックはバッファリングされ、5分ごとにクラスタに送信されます。多分あなたは長く待っているだけではないでしょうか?

+0

あなたが正しいと言えます。ニース!この期間を変更する方法はありますか? –

+0

気にしないでください。私はhttps://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-cluster-resource-manager-balancingで間隔を変更する方法を考え出したようです。 –

+0

更新 - 前のリンクは解決策につながりません。これは正しいものです - http://stackoverflow.com/questions/36472459/service-fabric-resource-balancer-uses-stale-reported-load –

関連する問題