public static IOMetricsEnvironment GetIoMetrics(StorageEnvironment storageEnvironment) { var ioMetrics = new IOMetricsEnvironment { Path = storageEnvironment.Options.BasePath.FullPath }; foreach (var fileMetric in storageEnvironment.Options.IoMetrics.Files) { ioMetrics.Files.Add(GetFileMetrics(fileMetric)); } return(ioMetrics); }
private void AddEnvironmentTypeToPathIfNeeded(IOMetricsEnvironment environment) { switch (environment.Type) { case StorageEnvironmentWithType.StorageEnvironmentType.Documents: environment.Path = Path.Combine(_basePath, "Documents"); break; case StorageEnvironmentWithType.StorageEnvironmentType.System: case StorageEnvironmentWithType.StorageEnvironmentType.Configuration: case StorageEnvironmentWithType.StorageEnvironmentType.Index: // those envs already contain env type in path Debug.Assert(environment.Path.Contains(environment.Type.ToString()), "environment.Path.Contains(environment.Type.ToString())"); break; default: throw new InvalidOperationException("Unknown type: " + environment.Type); } }
private IOMetricsResponse PrepareIOMetrics() { // 0. Prepare Response Object - Keep envs order the same as in the static endpoint response ! var preparedMetricsResponse = new IOMetricsResponse(); bool responseHasContent = false; // 1. Iterate over environments files in dictionary foreach (var envFile in _perEnvironmentsFilesMetrics) { // 2. Retrieve/Take meter items per environment file from the collection in dictionary var listOfMeterItems = new List <IoMeterBuffer.MeterItem>(); while (envFile.Value.TryTake(out IoMeterBuffer.MeterItem newItem)) { listOfMeterItems.Add(newItem); } if (listOfMeterItems.Count == 0) { continue; } // 3. Get env path & file name from dictionary item var meterItem = listOfMeterItems[0]; var file = new FileInfo(envFile.Key); var envPath = file.Directory; if (meterItem.Type == Sparrow.Server.Meters.IoMetrics.MeterType.Compression || meterItem.Type == Sparrow.Server.Meters.IoMetrics.MeterType.JournalWrite) { envPath = envPath?.Parent; } // 3a. Should not happen, but being extra careful here if (envPath == null) { continue; } // 4. Find relevant environment var currentEnvironment = preparedMetricsResponse.Environments.FirstOrDefault(x => x.Path == envPath.FullName); if (currentEnvironment == null) { var existingEnv = _environments.FirstOrDefault(x => x.Environment.Options.BasePath.FullPath == envPath.FullName); if (existingEnv != null) { currentEnvironment = new IOMetricsEnvironment { Path = envPath.FullName, Files = new List <IOMetricsFileStats>(), Type = existingEnv.Type }; } else { // If new index for example was added... currentEnvironment = new IOMetricsEnvironment { Path = envPath.FullName, Files = new List <IOMetricsFileStats>() }; if (envPath.FullName.Contains("Indexes")) { currentEnvironment.Type = StorageEnvironmentWithType.StorageEnvironmentType.Index; } else if (envPath.FullName.Contains("Configuration")) { currentEnvironment.Type = StorageEnvironmentWithType.StorageEnvironmentType.Configuration; } else if (envPath.FullName.Contains("System")) { currentEnvironment.Type = StorageEnvironmentWithType.StorageEnvironmentType.System; } else { currentEnvironment.Type = StorageEnvironmentWithType.StorageEnvironmentType.Documents; } } preparedMetricsResponse.Environments.Add(currentEnvironment); } // 5. Prepare response, add recent items. Note: History items are not added since studio does not display them anyway var preparedFilesInfo = currentEnvironment.Files.FirstOrDefault(x => x.File == file.Name) ?? new IOMetricsFileStats { File = file.Name }; currentEnvironment.Files.Add(preparedFilesInfo); foreach (var item in listOfMeterItems) { var preparedRecentStats = new IOMetricsRecentStats { Start = item.Start.GetDefaultRavenFormat(true), Size = item.Size, HumaneSize = Sizes.Humane(item.Size), FileSize = item.FileSize, HumaneFileSize = Sizes.Humane(item.FileSize), Duration = Math.Round(item.Duration.TotalMilliseconds, 2), Type = item.Type }; responseHasContent = true; preparedFilesInfo.Recent.Add(preparedRecentStats); } } if (responseHasContent == false) { return(null); } return(preparedMetricsResponse); }