多个 Digital Ocean 服务中断
Multiple Digital Ocean services down

原始链接: https://status.digitalocean.com/incidents/lgt5xs2843rx

这段代码主要集中在增强组件状态页面的显示和功能,可能是一个系统状态仪表盘。它将组件重新组织为“全局”和“区域”部分,优先显示具有活动问题的组件(红色、黄色、橙色或蓝色状态)。布局调整包括切换列显示和修改特定状态的背景颜色。 实施了多项UI改进:移除正常运行时间链接,添加工具提示和ARIA标签以提高可访问性,以及为图例添加视觉间距。代码还在历史页面添加了状态图例。 进一步的增强针对过滤器按钮的UX,包括“清除选择”选项和关于旧事件的过滤器限制说明。通过调整Android和iPhone设备上的组件宽度来解决移动响应问题。最后,长的事件描述被截断并提供“展开/折叠”功能以提高可读性。

## DigitalOcean 服务中断总结 一次大范围的中断影响了 DigitalOcean 的多项服务——API、应用平台、负载均衡器和 Spaces,持续时间约为 18 小时,主要归因于 Cloudflare 的问题。用户发现 DigitalOcean 依赖 Cloudflare 作为某些服务的上游依赖项,尽管这并未在他们的子处理器列表中明确说明(Railway.com 和 Wasabi 也出现了类似问题)。 讨论强调了隐藏依赖项以及依赖大型提供商时中断的连锁效应。虽然 droplets 未受影响,但用户们争论了 DigitalOcean 的负载均衡器与自管解决方案(如 HAProxy 或 Nginx)的价值。一些用户利用 DO 的负载均衡器以相对较低的成本实现高可用性,而另一些人则质疑它们对于小型项目的必要性。 这次中断引发了关于云服务提供商事故(Azure、AWS、Cloudflare)日益频繁的更广泛讨论,以及潜在原因,包括 DDoS 攻击、内部测试或地缘政治因素。许多评论员指出对 CDN 的依赖以及在不影响客户的情况下关闭它们所面临的困难。
相关文章

原文

').appendTo('.regional') $('.components-container').appendTo('.regional') // Global services layout $('

').prependTo('.components-section') $('').appendTo('.global') $('.components-container').clone().appendTo('.global') // build layout table for global services with three rows var global_containers = $('.global > .components-container').find('.component-container'); global_containers.each(function(){ if($(this).find('.status-red').length || $(this).find('.status-yellow').length || $(this).find('.status-orange').length || $(this).find('.status-blue').length){ $(this).prependTo('.global > .components-container'); } if($(this).find('.child-components-container').length){ $(this).remove(); } }); $(function() { $('.components-container').toggleClass('one-column').toggleClass('three-columns') }); // build layout table for regional services var regional_containers = $('.regional > .components-container').find('.component-container'); regional_containers.each(function(){ if($(this).find('.status-red').length || $(this).find('.status-yellow').length || $(this).find('.status-orange').length || $(this).find('.status-blue').length){ $(this).find('.child-components-container > .component-inner-container').each(function(){ if(!$(this).hasClass('status-green')) { this.style.setProperty('background-color', 'rgba(243, 245, 249, 0.97)','important'); this.style.setProperty('margin-bottom', '0','important'); } }); $(this).prependTo('.regional > .components-container'); } if($(this).find('.child-components-container').length == 0){ $(this).remove(); } }) // remove uptime $(function() { $('.components-section > .components-uptime-link').remove(); }); // tooltips for status images in incident header $(function() { $('.icon-indicator.investigating').attr('title','Investigating'); $('.icon-indicator.identified').attr('title','Issue Identified'); $('.icon-indicator.monitoring').attr('title','Monitoring'); $('.icon-indicator.maintenance').attr('title','Maintenance'); }); // add aria-labels $(function() { $('.fa-check').attr('aria-label','Operational'); $('.fa-minus-square').attr('aria-label','Degraded Performance'); $('.fa-exclamation-triangle').attr('aria-label','Partial Outage'); $('.fa-times').attr('aria-label','Major Outage'); $('.fa-wrench').attr('aria-label','Maintenance'); $('.component-statuses-legend').attr('aria-label','Statuses Legend'); $('.container > .logo > img').attr('alt','DigitalOcean logo'); }); // spacer to visually separate main page legend $(function() { $('
').prependTo('.container > .components-section > .component-statuses-legend'); }); // add legend to history page $(function() { if ($('[data-react-class=HistoryIndex]').length) { $('
Impact levels• Critical • Major • Minor • Maintenance • Retroactive
').insertAfter('.pagination'); } }); // Filter button UX improvements function resetSelection() { $("input:checkbox").each(function() { if(this.checked == true) { this.click(); } }); } $(function() { if ($('[data-react-class=HistoryIndex]').length) { window.addEventListener('click', function(e) { if($(event.target).closest('.grouped-items-selector').length === 0 && $(event.target).closest('.component-selector').length === 0 && $(event.target).closest('.cc-window').length === 0 ){ if ($('.grouped-items-selector').length) { $('.component-selector > span').click(); e.stopImmediatePropagation(); } } else { if ($('.grouped-items-selector').length && !$('#reset-selection').length) { $('

  - Clear selection

').prependTo('.grouped-items-selector'); $('#reset-selection').click(resetSelection); e.stopImmediatePropagation(); } } }); } }); $(function() { $('* Note: Incidents before May 10th, 2023 were backfilled and don\'t support the filter feature.').prependTo('.months-container'); }); $(function() { if (/Android|iPhone/i.test(navigator.userAgent)) { $( '.component-container' ).each(function () { this.style.setProperty( 'width', '95%', 'important' ); }); } }); // Shorten header incident describtions function revealTruncated (incidentID) { let truncateDivName = "#truncate_" + incidentID; let expandLinkDivName = "#expand_" + incidentID; let truncateLink = " [less] " $(truncateDivName).css('display','inline'); $(expandLinkDivName).insertAfter(truncateDivName) $(expandLinkDivName).html(truncateLink); } function hideTruncated (incidentID) { let truncateDivName = "#truncate_" + incidentID; let expandLinkDivName = "#expand_" + incidentID; let truncateLink = " [...] " $(truncateDivName).css('display','None'); $(expandLinkDivName).insertBefore(truncateDivName) $(expandLinkDivName).html(truncateLink); } $('.update > span.whitespace-pre-wrap').each(function() { let textLength = $(this).text().split(/\s+/).length; if (textLength > 81){ // get incident ID let incidentUrl = $(this).closest('.unresolved-incident').find('a')[0]; let incidentID = (String(incidentUrl)).split("incidents/")[1]; let firstPart = $(this).html().split(/\s+/).slice(0,80).join(' '); let secondPart = '

' + $(this).html().split(/\s+/).slice(80,textLength).join(' ') + '

'; let expandLink = "" $(this).html(firstPart + expandLink + secondPart); } });
联系我们 contact @ memedata.com